我希望在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)
但在原始数据类型的其他情况下,您将不得不迭代它.
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()
对于不同的数组类型,存在方法的重载变体.
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
它会创建一个单个元素的列表,它是给定的数组,而不是数组元素的列表.
我相信唯一能够做到这一点的方法是手动迭代数组.
for (int i = 0; i < list.length; i++) {
if (list[i] == 'e') {
System.out.println(i);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案:
将数组转换为列表,您可以获取元素的位置。
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)
您的代码的问题是,当您这样做时
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)