如何在Java中找到数组中元素的索引?

46 java arrays indexing

我希望在Java中找到给定元素的索引,知道它的内容.

我尝试了以下示例,该示例不起作用:

class masi { 
    public static void main( String[] args ) { 
        char[] list = {'m', 'e', 'y'};

        // should print 1
        System.out.println(list[] == "e");                    
    } 
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这有什么问题以及我需要做些什么来解决它?

Bar*_*ers 51

在这种情况下,您可以从字符数组中创建新的String,然后对该字符串执行indeoxOf("e"):

System.out.println(new String(list).indexOf("e")); 
Run Code Online (Sandbox Code Playgroud)

但在原始数据类型的其他情况下,您将不得不迭代它.

  • 请注意,这仅适用于 char 数组,因为每个字符的长度将为 1。 (2认同)

Max*_*x77 18

或者,您可以使用Commons Lang ArrayUtils类:

int[] arr = new int{3, 5, 1, 4, 2};
int indexOfTwo = ArrayUtils.indexOf(arr, 2);
Run Code Online (Sandbox Code Playgroud)

indexOf()对于不同的数组类型,存在方法的重载变体.

  • 这是最好的方法.如果项目中没有apache,请添加它.另一种方法是使用java.util.Arrays.binarySearch但它需要一个有序数组,因此并不总是有用. (2认同)

Joe*_*oey 17

这甚至不是有效的语法.你正在尝试与字符串进行比较.对于数组,您必须自己遍历数组:

public class T {
  public static void main( String args[] ) {
    char[] list = {'m', 'e', 'y'};

    int index = -1;

    for (int i = 0; (i < list.length) && (index == -1); i++) {
        if (list[i] == 'e') {
            index = i;
        }
    }

    System.out.println(index);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您正在使用集合,例如ArrayList<Character>您也可以使用以下indexOf()方法:

ArrayList<Character> list = new ArrayList<Character>();
list.add('m');
list.add('e');
list.add('y');

System.out.println(list.indexOf('e'));
Run Code Online (Sandbox Code Playgroud)

还有一个Arrays类缩短了上面的代码:

List list = Arrays.asList(new Character[] { 'm', 'e', 'y' });
System.out.println(list.indexOf('e'));
Run Code Online (Sandbox Code Playgroud)


Tun*_*aki 10

对于原始数组

从Java 8开始,基本数组的通用解决方案arr和要搜索的值val是:

public static int indexOf(char[] arr, char val) {
    return IntStream.range(0, arr.length).filter(i -> arr[i] == val).findFirst().orElse(-1);
}
Run Code Online (Sandbox Code Playgroud)

此代码在数组的索引上创建一个流IntStream.range,过滤索引以仅保留索引处的数组元素等于搜索值的那些,并最终保持第一个匹配的索引findFirst.findFirst返回一个OptionalInt,因为可能没有找到匹配的索引.所以我们调用orElse(-1)返回找到的值或者-1找不到任何值.

过载可以被添加int[],long[]等的方法的该机构将保持不变.

对于对象数组

对于对象数组,String[]我们可以使用相同的想法并使用该equals方法进行过滤步骤,或者Objects.equals考虑两个null相等的元素,而不是==.

但我们可以通过以下方式更简单地完成:

public static <T> int indexOf(T[] arr, T val) {
    return Arrays.asList(arr).indexOf(val);
}
Run Code Online (Sandbox Code Playgroud)

这将为输入数组创建一个列表包装器,并使用Arrays.asList和搜索元素的索引indexOf.

这个解决方案不适用于原始数组,如下所示:原始数组int[]不是一个Object[]而是一个Object; 因此,调用asList它会创建一个单个元素的列表,它是给定的数组,而不是数组元素的列表.


Mat*_*nit 8

我相信唯一能够做到这一点的方法是手动迭代数组.

for (int i = 0; i < list.length; i++) {
  if (list[i] == 'e') {
    System.out.println(i);
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)


Meo*_*der 6

最简单的解决方案

将数组转换为列表,您可以获取元素的位置。

List<String> abcd  = Arrays.asList(yourArray);
int i = abcd.indexOf("abcd");
Run Code Online (Sandbox Code Playgroud)

其他解决方案,您可以迭代数组:

int position = 0;
for (String obj : yourArray) {
    if (obj.equals("abcd") {
    return position;
    }
    position += 1;
} 

//OR
for (int i = 0; i < yourArray.length; i++) {
    if (obj.equals("abcd") {
       return i;
    }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 5

您的代码的问题是,当您这样做时

 list[] == "e"
Run Code Online (Sandbox Code Playgroud)

您询问数组对象(而不是内容)是否等于字符串“e”,显然情况并非如此。

您需要迭代内容以进行所需的检查:

 for(String element : list) {
      if (element.equals("e")) {
           // do something here
      }
 }
Run Code Online (Sandbox Code Playgroud)