为了简化上下文,让我们来看看假设我们在Java中有一个2D数组,我们需要得到给定1D数组的索引。有没有更干净的方式做同样的事情?我的数组的大小非常小(3 x 8),所以我设法使用for循环强制元素并获得索引,但是如果数组的大小足够大怎么办?为了我的目的,我使用了以下代码:
private int getIndex(double[][] centerArrayOriginal, double[] row){
double[] currRow;
int index = -1;
for (int i=0; i<centerArrayOriginal.length;i++){
currRow = centerArrayOriginal[i];
if ((currRow[0] == row[0]) && (currRow[1] == row[1]) && (currRow[2] == row[2])){
index = i;
}
}
return index;
}
显然,这不是最干净的方式,我尝试使用ArrayList
个double[]
元素并使用.indexOf()
方法,但它始终返回-1
。
答案 0 :(得分:1)
如果你必须搜索数组中的给定行,我看不到“强制执行”的替代方法。但是,当您使用double
数组时,应该注意的是,由于舍入错误,如果row
1D数组来自例如{1}} 1D数组,则行搜索算法可能不起作用。计算结果。当centerArrayOriginal
和row
的数据由double
文字(常量)组成时,您应该只假设可靠的结果。
无论如何,这是一个使用两个嵌套for循环来从任意大小的2D数组中查找行的解决方案:
private static int getIndex(double[][] centerArrayOriginal, double[] row) {
for (int i = 0; i < centerArrayOriginal.length; i++) {
double[] currRow = centerArrayOriginal[i];
if (currRow.length != row.length) {
throw new IllegalArgumentException(String.format(
"The size of the input row (%d) does not "
+ "match the size of the rows in the array (%d)",
row.length, currRow.length));
}
boolean allElementsEqual = true;
for (int j = 0; j < row.length; j++) {
if (currRow[j] != row[j]) {
allElementsEqual = false;
break;
}
}
if (allElementsEqual) {
return i;
}
}
return -1;
}
测试代码:
double[][] data = new double[][]
{
{ 1.0d, 2.0d, 3.0d },
{ 4.0d, 5.0d, 6.0d },
{ 7.0d, 8.0d, 9.0d }
};
double[] test = new double[] {4.0d, 5.0d, 6.0d};
System.out.println(getIndex(data, test));
打印出来
1