如果父数组具有相同子数组的元素,如何从父数组中搜索子数组的元素?

时间:2019-06-18 09:44:57

标签: java

我是Java新手。我有一个问题,我有两个数组parentArraysubArray

  • parentArray的值为{1,4,4,3,6}
  • subArray的值为{4,4,3}

因此,第二个数组或所谓的subArray值包含在第一个数组即所谓的parentArray中,其索引从[1,2,3]开始。我的问题是如何返回subArray的第一个元素的索引值,该元素也是parentArray的一部分。

int[] parentArray = new int[]{1,4,4,3,6};
int[] subArray = new int[]{4,4,3};

由于subArray的值位于[1]的parentArray起始索引中,因此我希望程序返回1

我尝试比较两个数组并从两个数组返回公共元素。但是在此之前,我是一个初学者,因此我无法想到任何逻辑。

3 个答案:

答案 0 :(得分:6)

我为此创建了一个方法。尝试以下代码,

public int checkSubArray(int[] parentArray, int[] subArray) {
    int result = -1;
    for (int i = 0; i < parentArray.length; i++) {
        int[] temp = Arrays.copyOfRange(parentArray, i, (subArray.length + i)); //This will create a temporary sub array
        if (Arrays.equals(temp, subArray)) {
            System.out.println(i);
            result = i;
        }
    }
    return result;
}

改进的答案

public int checkSubArray(int[] parentArray, int[] subArray) {
    int result = -1;
    for (int i = 0; i < parentArray.length; i++) {
        if (parentArray[i] == subArray[0]) { // Checking if the first value matches
            int[] temp = Arrays.copyOfRange(parentArray, i, (subArray.length + i)); // This will create a temporary sub array
            if (Arrays.equals(temp, subArray)) {
                System.out.println(i);
                result = i;
            }
        }
    }
    return result;
}

答案 1 :(得分:3)

您可以按如下方式使用Collections.indexOfSubList()

List<Integer> parentArray = Arrays.asList(1,4,4,3,6);
List<Integer> subArray = Arrays.asList(4,4,3);

int index = Collections.indexOfSubList(parentArray , subArray);
// index is 1

如果要实现数组,请从中检出源代码并进行一些修改:

public static int indexOfSubList(int[] source, int[] target) {
  int sourceSize = source.length;
  int targetSize = target.length;
  int maxCandidate = sourceSize - targetSize;

  nextCand:
    for (int candidate = 0; candidate <= maxCandidate; candidate++) {
      for (int i=0, j=candidate; i<targetSize; i++, j++)
        if (!(target[i] == source[j]))
          continue nextCand;  // Element mismatch, try next cand
      return candidate;  // All elements of candidate matched target
    }
  return -1;  // No candidate matched the target
}

用法:

int[] parentArray = new int[]{1,1,1,4,4,3,6};
int[] subArray = new int[]{4,4,3};
int index = indexOfSubList(parentArray, subArray);
// index is 3
System.out.println(index);

答案 2 :(得分:1)

如果您的数组仅包含小于10的整数,您也可以尝试这样的方式

public static void main(String[] args) {

    int[] parentArray = new int[]{1, 4, 4, 3, 6};
    int[] subArray = new int[]{4, 4, 3};

    String s1 = convertToString(parentArray);

    String s2 = convertToString(subArray);

    System.out.print(s1.indexOf(s2));
}

private static String convertToString(int[] array) {

    StringBuilder stringBuilder = new StringBuilder();

    for(int num : array){
        stringBuilder.append(num);
    }
    return stringBuilder.toString();
}