尺寸可变的参数

时间:2019-03-01 11:05:24

标签: java multidimensional-array

我试图用Java编写一个方法来搜索数组中的项并输出索引。但是,我希望它可以处理不同维度的数组。由于必须将输入类型声明为例如String [] [],因此无法将String []作为参数传递。

我要实现的示例:

int[][] my_array1 = {{1, 2}, {3, 4}};
int[] my_array2 = {5,6};

int item1 = 2;
int item2 = 5;

search_item(my_array1, item1);
search_item(my_array2, item2);

输出:

"Index of item1:" [0][1]
"Index of item2:" [0]

我不知道该怎么做。我尝试使用到目前为止还无法使用的通用数组。

谢谢。

2 个答案:

答案 0 :(得分:3)

这是递归解决方案的草图:

public List<String> findArrayMatches(Object [] input, String pattern) {
  List<String> matchingIndices = new ArrayList<>();
  for (int i = 0; i < input.length; i++) {
    Object elem = input[i];
    if (elem instanceof String) {
      String elemString = (String)elem;
      // check if elemString matches pattern and add index to matchingIndices if it does
    } else if (elem instanceof Object[]) {
      Object [] elemArray = (Object[])elem;
      //recursive call here
      List<String> matchingSublevel = findArrayMatches(elemArray, pattern);
      //prepend current index to all items of matchingSublevel and add to matchingIndices
    } else {
      throw new IllegalArgumentException("input is not an array of strings or arrays");
    }
  }
  return matchingIndices;
}

有关此代码的一些注意事项:

  1. 如您所见,编译器无法检查输入数组是否仅包含要允许的元素,您必须在运行时进行检查
  2. 一切都依赖于这样的事实:(在Java中)多维数组只是其元素也是数组的数组。
  3. 此代码还处理“奇异”的多维数组,即在同一级别上混合使用字符串和数组
  4. 此解决方案依赖的另一个重要功能是covariance of arrays,即任何数组都是instanceof Object[]。泛型不是这种情况,如果您尝试将新元素插入input数组中,则会导致问题。幸运的是你没有。
  5. 当我在上一点中说“任何数组”时,这并不完全正确。它是不是原始数组的任何数组,因此它可以与String[]一起使用,但不能与int[]一起使用。我会留给您研究如何使其与int[]一起使用,因为这可能很奇怪,但对基本原理却没有多大作用。

答案 1 :(得分:1)

类似的事情应该起作用。这有点令人讨厌,返回一个String,但是我想您明白了。另外,请注意,只会引发第一个巧合。

第一次调用该方法的nRow为0。-> checkPosition(0, valueToCheck);

public String checkPosition(int nRow, int valueToCheck)  
{
    if(nRow>= array.length) 
       return "";
    List<Integer> rowvalues = Arrays.asList(Arrays.asList(array).get(nRow));
    if(rowvalues.contains(valueToCheck))
    {
        String result = "["+nRow+"]["+rowvalues.indexOf(valueToCheck)+"]";
        if (!array.getClass().getComponentType().isArray())
             result= result.substring(result.indexOf("["), result.lastIndexOf("["));
        return result;
     }

  return checkPosition(nRow+1, valueToCheck);
}

示例:

  

(检查0,5)

  • 1维-array: [0,1,0,5,0] | output: [3]
  • 2个维度-array: [0[0,5,0,0,0],0,0,0,0] | output: [0][1]