如何在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值的位置,最后使第一个匹配findFirst
。 findFirst
返回一个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.asList
search元素的索引。
这个解决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; }