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

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

我试了下面的例子,这是行不通的:

class masi { public static void main( String[] args ) { char[] list = {'m', 'e', 'y'}; // should print 1 System.out.println(list[] == "e"); } } 

任何人都可以请解释这是什么问题,我需要做什么来解决它?

在这种情况下,您可以从您的字符数组中创build新的string,然后在该string上执行indeoxOf(“e”):

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

但是在其他原始数据types的情况下,你必须迭代它。

这甚至不是有效的语法。 你正在试图比较一个string。 对于数组,你将不得不自己走arrays:

 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<Character>那么也可以使用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')); 

我相信唯一最好的方法是手动迭代数组。

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

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

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

对于不同的数组types,有重载的indexOf()方法的变体。

对于原始数组

从Java 8开始,用于基本数组arr通用解决scheme和用于searchval的值是:

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

此代码使用IntStream.range在数组的索引上创build一个stream, 过滤索引以仅保留那些位于该索引处的数组元素等于search值的位置,最后使第一个匹配findFirstfindFirst返回一个OptionalInt ,因为可能没有find匹配的索引。 所以我们调用orElse(-1)返回find的值,如果没有find,则返回-1

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

对于对象数组

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

但是我们可以用更简单的方式来做到这一点:

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

这将使用Arrays.asList创buildinput数组的列表包装,并使用Arrays.asListsearch元素的索引。

这个解决scheme不适用于原始数组, 如下所示 :像int[]这样的基本数组不是Object[]而是Object ; 因此,调用asList会创build一个单个元素的列表,该元素是给定的数组,而不是数组元素的列表。

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

  list[] == "e" 

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

你会想遍历内容,以做你想要的检查:

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

现在它打印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" 

是一个string对象字面量(它表示一个string对象)

'E'

是一个字符文字(它代表一个字符原始数据types)

甚至当

 list[] 

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

只要使用indexOfstring函数,就可以在任何字母表(或字符数组)内find任何字符,

非常沉重的编辑。 我想或者你想这样做:

 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。 第一个会让你把一个string像“qwerty”,并分配q = 0,w = 1,e = 2,r = 3 …

这种方式应该工作,改变“字符”为“字符”:

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

如果元素的初始顺序并不重要,那么可以对数组进行sorting,然后使用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') ); } } 

我正在提供适当的方法来做到这一点

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