【问题标题】:How to find the index of an element in an array in Java?如何在Java中找到数组中元素的索引?
【发布时间】:2010-12-04 01:45:59
【问题描述】:

我正在寻找给定元素的索引,知道它的内容,在 Java 中。

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

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

        // should print 1
        System.out.println(list[] == "e");                    
    } 
}

谁能解释一下这有什么问题以及我需要做些什么来解决它?

【问题讨论】:

    标签: java arrays indexing


    【解决方案1】:

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

    System.out.println(new String(list).indexOf("e")); 
    

    但在其他原始数据类型的情况下,您必须对其进行迭代。

    【讨论】:

    • 小心,这仅适用于 char 数组,因为每个字符的长度为 1。
    【解决方案2】:

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

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

    indexOf() 方法有针对不同数组类型的重载变体。

    【讨论】:

    • 这是最好的方法。如果您的项目中没有 apache,请添加它。另一种方法是使用 java.util.Arrays.binarySearch 但它需要一个排序数组,所以并不总是有用。
    • 你能在这里写下完整的实现来添加到项目中吗?
    【解决方案3】:

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

    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);
      }
    }
    

    如果您使用的是集合,例如ArrayList&lt;Character&gt;,您也可以使用indexOf() 方法:

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

    还有 Arrays 类可以缩短上面的代码:

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

    【讨论】:

    • 我非常怀疑是否有 list 类型可以用来构建数组。如果有,则严重违反了命名约定。
    • List 定义为toArray 方法
    • 这是对 aperkins 的回复,他显然对我的 list[] == "e" 语法无效的声明投了反对票。要使[] 工作,list 必须是类型,而不是变量。这就是我所说的“list 类型来构建数组”的意思。很抱歉造成误解。
    【解决方案4】:

    对于原始数组

    从 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);
    }
    

    此代码使用IntStream.rangefilters the indexes 在数组的索引上创建一个流,以仅保留该索引处的数组元素等于搜索值的那些元素,并最终保持与findFirst 匹配的第一个元素. findFirst 返回一个OptionalInt,因为可能没有找到匹配的索引。所以我们调用orElse(-1) 来返回找到的值,如果没有找到则返回-1

    可以为int[]long[] 等添加重载。方法的主体将保持不变。

    对于对象数组

    对于对象数组,例如String[],我们可以使用相同的想法并使用equals 方法或Objects.equals 来考虑两个null 元素相等的过滤步骤instead of ==

    但我们可以通过以下方式以更简单的方式做到这一点:

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

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

    这个解决方案不适用于原始数组as shown here:像int[] 这样的原始数组不是Object[],而是Object;因此,在其上调用 asList 会创建一个包含单个元素的列表,它是给定的数组,而不是数组元素的列表。

    【讨论】:

      【解决方案5】:

      我相信 only 最明智的方法是手动遍历数组。

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

      【讨论】:

        【解决方案6】:

        你的代码的问题是当你这样做时

         list[] == "e"
        

        你问的是数组对象(不是内容)是否等于字符串“e”,显然不是这样。

        您需要遍历内容以进行所需的检查:

         for(String element : list) {
              if (element.equals("e")) {
                   // do something here
              }
         }
        

        【讨论】:

          【解决方案7】:

          最简单的解决方案

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

          List<String> abcd  = Arrays.asList(yourArray);
          int i = abcd.indexOf("abcd");
          

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

          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;
              }
          }
          

          【讨论】:

            【解决方案8】:

            现在它确实打印了 1

            class Masi {
                public static void main( String [] args ) {
                     char [] list = { 'm', 'e', 'y' };
            
                     // Prints 1
                     System.out.println( indexOf( 'e', list ) );
                }
            
                private static int indexOf( char c , char [] arr ) {
                    for( int i = 0 ; i < arr.length ; i++ ) {
                        if( arr[i] == c ) { 
                            return i;
                        }
                     }
                     return -1;
                 }
             }
            

            请记住

            "e"
            

            是一个字符串对象字面量(它代表一个字符串对象)

            虽然

            'e'

            是一个字符字面量(它表示一个字符原始数据类型)

            即使

            list[]
            

            将字符元素与字符串元素进行比较将是有效的Java(不是)无论如何都会返回false。

            只需使用 indexOf 字符串函数,您就可以在任何字母(或字符数组)中找到任何字符

            【讨论】:

              【解决方案9】:

              这种方式应该可行,将“char”更改为“Character”:

              public static void main(String[] args){
                Character[] list = {'m', 'e', 'y'};
                System.out.println(Arrays.asList(list).indexOf('e')); // print "1"
              }
              

              【讨论】:

                【解决方案10】:

                经过大量编辑。我想要么你想要这个:

                class CharStorage {
                    /** set offset to 1 if you want b=1, o=2, y=3 instead of b=0... */
                    private final int offset=0;
                    private int array[]=new int[26];
                
                    /** Call this with up to 26 characters to initialize the array.  For 
                      * instance, if you pass "boy" it will init to b=0,o=1,y=2.
                      */
                    void init(String s) {
                        for(int i=0;i<s.length;i++)
                            store(s.charAt(i)-'a' + offset,i); 
                    }
                
                    void store(char ch, int value) {
                        if(ch < 'a' || ch > 'z') throw new IllegalArgumentException();
                        array[ch-'a']=value;
                    }
                
                    int get(char ch) {
                        if(ch < 'a' || ch > 'z') throw new IllegalArgumentException();
                        return array[ch-'a'];
                    }
                }
                

                (注意,如果你想使用 1-26 而不是 0-25,你可能需要调整 init 方法)

                或者你想要这个:

                int getLetterPossitionInAlphabet(char c) {
                    return c - 'a' + 1
                }
                

                第二个是如果你总是想要 a=1,z=26。第一个将让您输入像“qwerty”这样的字符串并分配 q=0, w=1, e=2, r=3...

                【讨论】:

                • 我需要在数组中有字母,例如:a -> 1, b -> 2,..., z -> 26。 - 我编码只是为了好玩,而不是为了家庭作业。
                • 您的解决方案建议我需要 26 个 hashMap 命令。有什么方法可以组合 hashmaps 命令?
                • 嘿嘿,如果你只想知道a是1,b是2,就用"charValue-'a'+1"吧!我以为您实际上想要具有不同的值,或者将内容存储在存储桶中。
                【解决方案11】:

                这是另一个示例,以及 indexOf 的工作原理。

                public int indexOf(Object target) {
                    for (int i = 0; i < array.length; i++) {
                        if (equals(target, array[i])) {
                            return i;
                        }
                    }
                    return -1;
                }
                

                【讨论】:

                  【解决方案12】:

                  如果元素的初始顺序不是很重要,你可以对数组进行排序,然后 binarySearch:

                  import java.util.Arrays;
                  
                  class masi { 
                      public static void main( String[] args ) { 
                          char[] list = {'m', 'e', 'y'};
                          Arrays.sort(list);
                  
                          // should print 0, as e is now sorted to the beginning
                          // returns negative number if the result isn't found
                          System.out.println( Arrays.binarySearch(list, 'e') );
                      } 
                  }
                  

                  【讨论】:

                  • 顺序对我来说很重要。我的例子比我目前手头的问题更简单。我的列表中实际上有 26 个字母,从 a、b、... 到 z。
                  【解决方案13】:

                  我提供了正确的方法来做这个

                  /**
                       * Method to get the index of the given item from the list
                       * @param stringArray
                       * @param name
                       * @return index of the item if item exists else return -1
                       */
                      public static int getIndexOfItemInArray(String[] stringArray, String name) {
                          if (stringArray != null && stringArray.length > 0) {
                              ArrayList<String> list = new ArrayList<String>(Arrays.asList(stringArray));
                              int index = list.indexOf(name);
                              list.clear();
                              return index;
                          }
                          return -1;
                      }
                  

                  【讨论】:

                  • 不要转换成ArrayList,也不要调用list.clear()。这些将数组迭代 2 次。
                  【解决方案14】:

                  这样您最多可以使用“N”个字母。

                  char[] a={ 'a', 'b', 'c', 'd', 'e' };
                  int indexOf=0;
                  for(int i=0;i<a.length;i++){
                    if(a[i] != 'b'){
                      indexOf++;
                      }else{
                      System.out.println("index of given: "+indexOf);
                   }}
                  

                  【讨论】:

                    【解决方案15】:
                    int i = 0;
                    int count = 1;
                            while ('e'!= list[i] ) {
                                i++;
                                count++;
                            }
                    
                            System.out.println(count);
                    

                    【讨论】:

                    • 请在您的答案中添加一些解释,以便其他人可以从中学习
                    • 您的代码将计算在字符串中找到 'e' 字符的次数,而不是给出索引。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-10-27
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-01-12
                    • 2017-06-01
                    • 2011-09-04
                    相关资源
                    最近更新 更多