在数组中查找元素

有很多方法可以在数组中找到值的位置。以下示例片段都假设该数组是以下之一:

  String[] strings = new String[] { "A", "B", "C" };
  int[] ints = new int[] { 1, 2, 3, 4 };

另外,每个都将 indexindex2 设置为所需元素的索引,或者如果元素不存在则将 -1 设置为 -1

使用 Arrays.binarySearch (仅用于排序数组)

  int index = Arrays.binarySearch(strings, "A");
  int index2 = Arrays.binarySearch(ints, 1);

使用 Arrays.asList(仅适用于非原始数组)

  int index = Arrays.asList(strings).indexOf("A");
  int index2 = Arrays.asList(ints).indexOf(1);  // compilation error

使用 Stream

Version >= Java SE 8

  int index = IntStream.range(0, strings.length)
                       .filter(i -> "A".equals(strings[i]))
                       .findFirst()
                       .orElse(-1); // If not present, gives us -1.
  // Similar for an array of primitives

使用循环进行线性搜索

  int index = -1;
  for (int i = 0; i < array.length; i++) {
      if ("A".equals(array[i])) {
          index = i;
          break;
      }            
  }
  // Similar for an array of primitives

使用 org.apache.commons 等第三方库进行线性搜索

  int index = org.apache.commons.lang3.ArrayUtils.contains(strings, "A");
  int index2 = org.apache.commons.lang3.ArrayUtils.contains(ints, 1);

注意:使用直接线性搜索比包装在列表中更有效。

测试数组是否包含元素

上面的示例可以通过简单测试以查看计算的索引是否大于或等于零来测试数组是否包含元素。

或者,还有一些更简洁的变化:

boolean isPresent = Arrays.asList(strings).contains("A");

Version >= Java SE 8

boolean isPresent = Stream<String>.of(strings).anyMatch(x -> "A".equals(x));
boolean isPresent = false;
for (String s : strings) {
    if ("A".equals(s)) {
        isPresent = true;
        break;
    }
}

boolean isPresent = org.apache.commons.lang3.ArrayUtils.contains(ints, 4);