#java #groovy
#java #groovy
Вопрос:
Я работаю над проектом, в котором я хочу преобразовать код Java в Groovy и / или могу импортировать Java-код функции в groovy. Он отлично работал с java, но не работал так, как ожидалось, в groovy.
В принципе нужно написать функцию, где сгенерированный код Уолша умножается на данные и выдает расширяющиеся данные. таким образом, минимально потребовалось (2 ^ 2 = 4 узла), чтобы показать базовую функциональность.
// Java code illustrating a simple implementation of CDMA
import java.util.*;
public class simple_cdma {
private int[][] wtable;
private int[][] copy;
private int[] channel_sequence;
public void setUp(int[] data, int num_stations)
{
wtable = new int[num_stations][num_stations];
copy = new int[num_stations][num_stations];
buildWalshTable(num_stations, 0, num_stations - 1, 0,
num_stations - 1, false);
showWalshTable(num_stations);
for (int i = 0; i < num_stations; i ) {
for (int j = 0; j < num_stations; j ) {
// Making a copy of walsh table
// to be used later
copy[i][j] = wtable[i][j];
// each row in table is code for one station.
// So we multiply each row with station data
wtable[i][j] *= data[i];
}
}
channel_sequence = new int[num_stations];
for (int i = 0; i < num_stations; i ) {
for (int j = 0; j < num_stations; j ) {
// Adding all sequences to get channel sequence
channel_sequence[i] = wtable[j][i];
}
}
}
public void listenTo(int sourceStation, int num_stations)
{
int innerProduct = 0;
for (int i = 0; i < num_stations; i ) {
// multiply channel sequence and source station code
innerProduct = copy[sourceStation][i] * channel_sequence[i];
}
System.out.println("The data received is: "
(innerProduct / num_stations));
}
public int buildWalshTable(int len, int i1, int i2, int j1,
int j2, boolean isBar)
{
// len = size of matrix. (i1, j1), (i2, j2) are
// starting and ending indices of wtable.
// isBar represents whether we want to add simple entry
// or complement(southeast submatrix) to wtable.
if (len == 2) {
if (!isBar) {
wtable[i1][j1] = 1;
wtable[i1][j2] = 1;
wtable[i2][j1] = 1;
wtable[i2][j2] = -1;
}
else {
wtable[i1][j1] = -1;
wtable[i1][j2] = -1;
wtable[i2][j1] = -1;
wtable[i2][j2] = 1;
}
return 0;
}
int midi = (i1 i2) / 2;
int midj = (j1 j2) / 2;
buildWalshTable(len / 2, i1, midi, j1, midj, isBar);
buildWalshTable(len / 2, i1, midi, midj 1, j2, isBar);
buildWalshTable(len / 2, midi 1, i2, j1, midj, isBar);
buildWalshTable(len / 2, midi 1, i2, midj 1, j2, !isBar);
return 0;
}
public void showWalshTable(int num_stations)
{
System.out.print("n");
for (int i = 0; i < num_stations; i ) {
for (int j = 0; j < num_stations; j ) {
System.out.print(wtable[i][j] " ");
}
System.out.print("n");
}
System.out.println("-------------------------");
System.out.print("n");
}
// Driver Code
public static void main(String[] args)
{
/*
* C1 = [ 1 1 1 1]
* C2 = [ 1 -1 1 -1]
* C3 = [ 1 1 -1 -1]
* C4 = [ 1 -1 -1 1]
* Let their data bits currently be:
* D1 = -1
* D2 = -1
* D3 = 0 (Silent)
* D4 = 1
* Resultant channel sequence = C1.D1 C2.D2 C3.D3 C4.D4
* = [-1 -1 -1 -1] [-1 1 -1 1] [0 0 0 0] [ 1 -1 -1 1]
* = [-1 -1 -3 1]
*
* Now suppose station 1 wants to listen to station 2.
* Inner Product = [-1 -1 -3 1] x C2
* = -1 1 - 3 - 1 = -4
*
* Data bit that was sent = -4/4 = -1.
* */
int num_stations = 4;
int[] data = new int[num_stations];
//data bits corresponding to each station
data[0] = -1;
data[1] = -1;
data[2] = 0;
data[3] = 1;
simple_cdma channel = new simple_cdma();
channel.setUp(data, num_stations);
// station you want to listen to
int sourceStation = 1;
channel.listenTo(sourceStation, num_stations);
}
}
Кто-нибудь может подсказать мне, что не так с моим кодом?
Комментарии:
1. Пожалуйста, добавьте код, который вы пробовали, и как он не удался (например, ошибки, трассировки стека, журналы, …), Чтобы мы могли его улучшить.
Ответ №1:
прежде всего, я предлагаю вам следовать соглашениям Java bean YourClassName, yourVariable, а затем запомнить типы данных по умолчанию
В строке 60
public int buildWalshTable(int len, int i1, int i2, int j1, int j2, boolean isBar)
{
...
// In Groovy the first parameter will be a BigDecimal not an int and will fail
buildWalshTable(len / 2, i1, midi, j1, midj, isBar);
...
return 0;
}
Так что в Groovy это может быть изменено на:
public int buildWalshTable(BigDecimal len, int i1, int i2, int j1, int j2, boolean isBar)
{
...
// In Groovy the first parameter will be a BigDecimal
buildWalshTable(len / 2, i1, midi, j1, midj, isBar);
...
return 0;
}
Теперь переименуйте свой класс из simple_cdma в SimpleCdma Я рекомендую использовать для этого IDE или текстовый редактор.
Наконец, просто нужно переименовать ваш файл из .java в .groovy и готово.