java - Java中的求和(内置方法)的实现?
问题描述
大家好,新年快乐。
我来自 matlab 世界,一年前开始用 java 编码。我正在解决可能很容易但请耐心等待的问题!这是matlab的代码:状态是一个3d数组的变量,它的大小:2x4x64。状态值是:(这就是我在matlab的编辑器上得到的)
state(:,:,1) =
1 0 0 0
2 0 1 1
state(:,:,2) =
3 0 1 0
4 0 0 1
state(:,:,3) =
5 0 1 1
6 0 0 0
state(:,:,4) =
7 0 0 1
8 0 1 0
state(:,:,5) =
9 0 1 1
10 0 0 0
state(:,:,6) =
11 0 0 1
12 0 1 0
state(:,:,7) =
13 0 0 0
14 0 1 1
state(:,:,8) =
15 0 1 0
16 0 0 1
state(:,:,9) =
17 0 0 0
18 0 1 1
state(:,:,10) =
19 0 1 0
20 0 0 1
state(:,:,11) =
21 0 1 1
22 0 0 0
state(:,:,12) =
23 0 0 1
24 0 1 0
state(:,:,13) =
25 0 1 1
26 0 0 0
state(:,:,14) =
27 0 0 1
28 0 1 0
state(:,:,15) =
29 0 0 0
30 0 1 1
state(:,:,16) =
31 0 1 0
32 0 0 1
state(:,:,17) =
33 0 0 1
34 0 1 0
state(:,:,18) =
35 0 1 1
36 0 0 0
state(:,:,19) =
37 0 1 0
38 0 0 1
state(:,:,20) =
39 0 0 0
40 0 1 1
state(:,:,21) =
41 0 1 0
42 0 0 1
state(:,:,22) =
43 0 0 0
44 0 1 1
state(:,:,23) =
45 0 0 1
46 0 1 0
state(:,:,24) =
47 0 1 1
48 0 0 0
state(:,:,25) =
49 0 0 1
50 0 1 0
state(:,:,26) =
51 0 1 1
52 0 0 0
state(:,:,27) =
53 0 1 0
54 0 0 1
state(:,:,28) =
55 0 0 0
56 0 1 1
state(:,:,29) =
57 0 1 0
58 0 0 1
state(:,:,30) =
59 0 0 0
60 0 1 1
state(:,:,31) =
61 0 0 1
62 0 1 0
state(:,:,32) =
63 0 1 1
64 0 0 0
state(:,:,33) =
1 1 1 1
2 1 0 0
state(:,:,34) =
3 1 0 1
4 1 1 0
state(:,:,35) =
5 1 0 0
6 1 1 1
state(:,:,36) =
7 1 1 0
8 1 0 1
state(:,:,37) =
9 1 0 0
10 1 1 1
state(:,:,38) =
11 1 1 0
12 1 0 1
state(:,:,39) =
13 1 1 1
14 1 0 0
state(:,:,40) =
15 1 0 1
16 1 1 0
state(:,:,41) =
17 1 1 1
18 1 0 0
state(:,:,42) =
19 1 0 1
20 1 1 0
state(:,:,43) =
21 1 0 0
22 1 1 1
state(:,:,44) =
23 1 1 0
24 1 0 1
state(:,:,45) =
25 1 0 0
26 1 1 1
state(:,:,46) =
27 1 1 0
28 1 0 1
state(:,:,47) =
29 1 1 1
30 1 0 0
state(:,:,48) =
31 1 0 1
32 1 1 0
state(:,:,49) =
33 1 1 0
34 1 0 1
state(:,:,50) =
35 1 0 0
36 1 1 1
state(:,:,51) =
37 1 0 1
38 1 1 0
state(:,:,52) =
39 1 1 1
40 1 0 0
state(:,:,53) =
41 1 0 1
42 1 1 0
state(:,:,54) =
43 1 1 1
44 1 0 0
state(:,:,55) =
45 1 1 0
46 1 0 1
state(:,:,56) =
47 1 0 0
48 1 1 1
state(:,:,57) =
49 1 1 0
50 1 0 1
state(:,:,58) =
51 1 0 0
52 1 1 1
state(:,:,59) =
53 1 0 1
54 1 1 0
state(:,:,60) =
55 1 1 1
56 1 0 0
state(:,:,61) =
57 1 0 1
58 1 1 0
state(:,:,62) =
59 1 1 1
60 1 0 0
state(:,:,63) =
61 1 1 0
62 1 0 1
state(:,:,64) =
63 1 0 0
64 1 1 1
%%%%%%%%%%%%%%%%%%%
revealed =[1 0];
tmp=[0,0];
for m=1:2
tmp[1]=sum(abs(state(l, 3:4 ,j)-revealed)) % here state(m, 3:4 ,j) is actually the 3rd and 4th columns substracting from them the array revealed at every row (m=1, 2) of given j.
end
so at the end it returns tmp.
谁不明白matlab是有一个大小为2x4x64的数组状态和state(l,3:4,j)根据j给我两列值,然后我们减去从那时显示的数组,然后我们做abs然后对数组结果求和。例如:状态 (m, 3:4 , 1) 。J=1 给我 [0 0] 和 [1 1] 对于 m=1 , m=2 在第三和第四列。因此,在每 m 处,我根据 m 从第三列和第四列的两个值中减去显示 [1 0]。所以在这里 m=1 我们有 [0 0] 所以 [0 0] -显露 => [0 0]-[1 0] => [-1 0] 我们做 abs([-1 0]) 所以我们得到 [1 0] 然后我们求和,它是 1+0 => 1。在 m=1 我们得到 [1 1] 所以 [1 1]-[1 0] => [1 0] 我们对此做 abs array => [1 0] 然后我们做 sum 1+0 => 1 。
我正在尝试在 java 中做同样的事情/相同的概念(将此代码 matlab 转换为 java)。所以我所做的是:
int[64][2][4] state=
{
{{ 1 , 0 , 0 , 0},
{ 2 , 0 , 1, 1 }},
{{ 3 , 0 , 1 , 0},
{4 , 0 , 0 , 1}},
{{ 5 , 0 , 1 , 1},
{6 , 0 , 0 , 0}},
{{ 7 , 0 , 0 , 1},
{ 8 , 0 , 1 , 0 }}
{ {9 ,0 , 1 , 1},
{10 , 0 , 0 , 0}},
{ { 11 , 0 , 0 , 1},
{12 , 0 , 1 , 0}},
{ { 13 , 0 , 0 , 0},
{14 , 0 , 1 , 1}},
{ { 15 , 0 , 1 , 0},
{ 16 , 0 , 0 , 1} },
{{17 , 0 , 0 , 0},
{18 , 0 , 1 , 1 }},
{{19 , 0 , 1 , 0},
{20 , 0 , 0 , 1}},
{{21 , 0 , 1 , 1},
{ 22 , 0 , 0 , 0}},
{ { 23 , 0 , 0, 1} ,
{24 , 0 , 1 , 0}},
{ {25 , 0 , 1 , 1},
{26 , 0 , 0 , 0}},
{ {27 , 0 , 0 , 1},
{28 , 0 , 1 , 0}},
{{29 , 0 , 0 , 0},
{30 , 0 , 1 , 1}},
{{ 31 , 0 , 1 , 0},
{32 , 0 , 0 , 1}},
{ { 33 , 0 , 0 , 1},
{34 , 0 , 1 , 0} },
{{35 , 0 , 1 , 1},
{36 , 0 , 0 , 0}},
{{ 37 , 0 , 1 , 0},
{38 , 0 , 0 , 1}},
{{39 , 0 , 0 , 0},
{ 40 , 0 , 1 , 1}},
{{41 , 0 , 1 , 0},
{ 42 , 0 , 0 , 1}},
{{ 43 , 0 , 0 , 0},
{ 44 , 0 , 1 , 1}}
{45 , 0 , 0 , 1},
{46 , 0 , 1 , 0} },
{ { 47 , 0 , 1 , 1 },
{ 48 , 0 , 0 , 0 } },
{{ 49 , 0 , 0 , 1 },
{ 50 , 0 , 1 , 0 }},
{ { 51 , 0 , 1 , 1 },
{52 , 0 , 0 , 0} },
{ { 53 , 0, 1 , 0 },
{54 , 0 , 0 , 1} },
{ { 55 , 0 , 0 , 0 },
{ 56 , 0 , 1 , 1} },
{ {57 , 0 , 1 , 0},
{58 , 0 , 0 , 1} },
{ { 59 , 0 , 0 , 0 },
{ 60 , 0 , 1 , 1} },
{ { 61 , 0 , 0 , 1 },
{ 62 , 0 , 1 , 0} },
{ { 63 , 0 , 1 , 1},
{ 64 , 0 , 0 , 0 } },
};
public class GlobalMember
{
int[] revealed =[1 0];
int[] tmp= {0,0};
for(int j=0 ; j<64 ; j++)
{ for (int m = 0 ; l < 2 ; l++)
{
tmp[l] =
IntStream.of((Math.abs(state[m, 3 : 4, j] - revealed))).sum();
//note that I always just check 3rd and 4th columns values which
//they are implicitly an array with two element at every row of
//the two rows at every j(j is range from 0 to 64).
}
}
}
但听起来我错过了一些东西,它根本无法编译,谁能帮我如何在java中实现这个代码matlab?我的意思是在java中实现相同的matlab代码概念。
我为此苦苦挣扎了大约一周,但我不明白问题出在哪里。
多谢。
解决方案
首先让我们熟悉基础知识。让我们从二维数组开始。
a) 二维数组
想象二维数组不是数字网格,而是一维数组的层,因为这些层中的每一层都可以有一个任意长度的一维数组,让我们看一个例子
//This 2D array has 3 layers, each layer is denoted using {} brackets
int[][] test={
{1,2} //Layer 0 has 2 elements
,{3,4,5} //Layer 1 has 3 elements
,{6,7,8,9} //Layer 2 has 4 elements
};
要查询此代码,您会这样做
int layers=test.length; //This gives us the total layers in the 2D array
System.out.println(layers);
for(int i=0;i<layers;i++){System.out.println(test[i].length);}//This queries the number of elements in each layer
输出:
3 //Number of layers=3
2 //Layer 0 has 2 elements
3 //Layer 1 has 3 elements
4 //Layer 2 has 4 elements
你也可以像这样初始化一个二维数组
int rows=2;
int cols=3;
int[][] test=new int[rows][cols];
然而,一个限制是您可能已经从上面猜到了,您只能以网格方式初始化您的二维数组。层数是行,每层中每个一维数组的长度是列。
要遍历每个元素,你会这样做
for(int layer=0;layer<test.length;layer++) //iterate over each layer
{
for(int i=0;i<test[layer].length;i++) //for each layer iterate over all elements in that layer
{
int element=test[layer][i];
}
}
b) 3D 阵列
现在就像 2D 数组包含多层 1D 数组 3D 数组包含多层 2D 数组一样,让我们看一个示例
int[][][] test=
{
{ //This is layer 0
{0,1}
,{2,3,4}
}
,
{ //This is layer 1
{5,6}
,{7,8,9}
,{10,11,12}
}
,
{ //This is layer 2
{13,14}
,{15,16,17}
,{18,19,20,21}
,{22,23,24,25,26}
}
};
同样,您也可以像这样初始化 3D 数组
int layers=3;
int rows=4;
int col=5;
int[][][] test=new int[layers][rows][col];
再次限制每个 2D 数组层必须以网格方式初始化
事实上,您可以像这样从这个 3D 数组中的任何层引用一个 2D 数组
int[][] test2=test[0]; //get the 2D array stored in layer 0
还可以遍历这个 3D 数组中的每个元素,你已经挖掘了所有层
for(int layer2D=0;layer2D<test.length;layer2D++) //Iterate over every 2D array layer in this 3D array
{
for(int layer1D=0;layer1D<test[layer2D].length;layer1D++) //iterate over every 1D layer of this current 2D array
{
for(int element=0;element<test[layer2D][layer1D].length;element++) //finally iterate over every element of this current 1D layer or 1D array
{
int value=test[layer2D][layer1D][element];
}
}
}
好的,让我们现在解决您的问题。
1)修复你的阵列
由于您使用方法一初始化 3D 数组,因此您无需指定长度。这是你的最终数组
int[][][] state= //No need to specify lengths just use empty brackets
{
{ //Layer 0
{1 , 0 , 0 , 0},
{2 , 0 , 1, 1 }
}
,
{ //Layer 1 and so on
{3 , 0 , 1 , 0},
{4 , 0 , 0 , 1}
}
,
{
{5 , 0 , 1 , 1},
{6 , 0 , 0 , 0}
}
,
{
{7 , 0 , 0 , 1},
{8 , 0 , 1 , 0 }
}
,
{
{9 ,0 , 1 , 1},
{10 , 0 , 0 , 0}
}
,
{
{11 , 0 , 0 , 1},
{12 , 0 , 1 , 0}
}
,
{
{13 , 0 , 0 , 0},
{14 , 0 , 1 , 1}
}
,
{
{15 , 0 , 1 , 0},
{16 , 0 , 0 , 1}
}
,
{
{17 , 0 , 0 , 0},
{18 , 0 , 1 , 1 }
}
,
{
{19 , 0 , 1 , 0},
{20 , 0 , 0 , 1}
}
,
{
{21 , 0 , 1 , 1},
{22 , 0 , 0 , 0}
}
,
{
{23 , 0 , 0, 1},
{24 , 0 , 1 , 0}
}
,
{
{25 , 0 , 1 , 1},
{26 , 0 , 0 , 0}
}
,
{
{27 , 0 , 0 , 1},
{28 , 0 , 1 , 0}
}
,
{
{29 , 0 , 0 , 0},
{30 , 0 , 1 , 1}
}
,
{
{31 , 0 , 1 , 0},
{32 , 0 , 0 , 1}
}
,
{
{33 , 0 , 0 , 1},
{34 , 0 , 1 , 0}
}
,
{
{35 , 0 , 1 , 1},
{36 , 0 , 0 , 0}
}
,
{
{37 , 0 , 1 , 0},
{38 , 0 , 0 , 1}
}
,
{
{39 , 0 , 0 , 0},
{40 , 0 , 1 , 1}
}
,
{
{41 , 0 , 1 , 0},
{42 , 0 , 0 , 1}
}
,
{
{43 , 0 , 0 , 0},
{44 , 0 , 1 , 1}
}
,
{
{45 , 0 , 0 , 1},
{46 , 0 , 1 , 0}
}
,
{
{47 , 0 , 1 , 1 },
{48 , 0 , 0 , 0 }
}
,
{
{ 49 , 0 , 0 , 1 },
{ 50 , 0 , 1 , 0 }
}
,
{
{51 , 0 , 1 , 1 },
{52 , 0 , 0 , 0}
}
,
{
{53 , 0, 1 , 0 },
{54 , 0 , 0 , 1}
}
,
{
{55 , 0 , 0 , 0 },
{56 , 0 , 1 , 1}
}
,
{
{57 , 0 , 1 , 0},
{58 , 0 , 0 , 1}
}
,
{
{59 , 0 , 0 , 0 },
{60 , 0 , 1 , 1}
}
,
{
{61 , 0 , 0 , 1 },
{62 , 0 , 1 , 0}
}
,
{
{63 , 0 , 1 , 1},
{64 , 0 , 0 , 0 }
}
};
- 修复你的代码
这段代码在这里
public class GlobalMember { int[] revealed =[1 0]; int[] tmp= {0,0}; for(int j=0 ; j<64 ; j++) { for (int m = 0 ; l < 2 ; l++) { tmp[l] = IntStream.of((Math.abs(state[m, 3 : 4, j] - revealed))).sum(); //note that I always just check 3rd and 4th columns values which //they are implicitly an array with two element at every row of //the two rows at every j(j is range from 0 to 64). } } }
你不会看到java中的每个程序都以一个类和一个主方法开头,所以你所做的一切都需要封装在一个方法中,该方法在一个类内部你可以阅读这个简单的教程
让我们把它放在一个方法中,如果我不理解你的逻辑,请原谅我,但基本上如果你试图找到所有元素的总和,你必须声明一个变量来存储结果并继续添加它以获得你的结果。当我们这样做的时候,让我们在这个类中声明你的 main 方法
public class FindSum
{
public static void main(String[] args)
{
int[][][] state=//The array i showed above cause i can't be asked to paste that here again
System.out.println(findSum(state)); //You call that function here
}
public static int findSum(int[][][] state)
{
int sum=0;
//Using the same logic from above
for(int layer2D=0;layer2D<state.length;layer2D++) //Iterate over every 2D array layer in this 3D array
{
for(int layer1D=0;layer1D<state[layer2D].length;layer1D++) //iterate over every 1D layer of this current 2D array
{
for(int element=0;element<state[layer2D][layer1D].length;element++) //finally iterate over every element of this current 1D layer or 1D array
{
int value=state[layer2D][layer1D][element];
sum+=value;
}
}
}
return sum;
}
}
我在这里只介绍了基础知识所以找到一些好的教程,那里有很多。
推荐阅读
- javascript - 鉴于 readFileSync 只读取文件的内容,您如何将整个文件读取为字节或十六进制字符?
- javascript - 数组排序编号 1-100,但 100 显示为第一个索引?
- swift - 以编程方式更改状态时可以为 NSSwitch 设置动画吗?
- git - 仅当我从某些终端登录时才禁用 git 颜色
- excel - Excel:在一个单元格中查找多个字符串,并在另一个单元格中列出它们,根据单元格中的字符串
- typescript - 如何创建与特定文件映射一起使用的自定义 d 文件
- postgresql - PostgreSQL 更新慢
- java - mediacodec解码器中的无序BufferInfo.presentationTimeUs时间戳
- python - 如何将来自 Postman 的 Json 数据转换为 python 中的整数?
- tailwind-css - 如何让子 div 缩小到父 div 高度?