java 字符串 数组 索引_如何在Java中找到数组中元素的索引?

  • Post author:
  • Post category:java

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

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

class masi {

public static void main( String[] args ) {

char[] list = {‘m’, ‘e’, ‘y’};

// should print 1

System.out.println(list[] ==”e”);

}

}

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

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

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

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

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

int[] arr = new int{3, 5, 1, 4, 2};

int indexOfTwo = ArrayUtils.indexOf(arr, 2);

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

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

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

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,您还可以使用indexOf()方法:

ArrayList list = new ArrayList();

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的回复,他显然给了我一个downvote,声明list[] ==”e”是无效的语法。要使[]起作用,list必须是类型,而不是变量。多数民众赞成我用”list类型来构建数组”的意思。很抱歉对于这个误会。

对于原始数组

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

}

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

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

我相信only strike>这样做的方法是手动迭代数组。

for (int i = 0; i < list.length; i++) {

if (list[i] == ‘e’) {

System.out.println(i);

break;

}

}

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

list[] ==”e”

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

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

for(String element : list) {

if (element.equals(“e”)) {

// do something here

}

}

最简单的解决方案

Convert array to list and you can get position of an element.

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

}

}

现在它打印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字符串函数,您就可以在任何字母表(或字符数组)中找到任何字符

这是另一个例子以及indexOf是如何工作的。

public int indexOf(Object target) {

for (int i = 0; i < array.length; i++) {

if (equals(target, array[i])) {

return i;

}

}

return -1;

}

这种方式应该工作,将”char”更改为”Character”:

public static void main(String[] args){

Character[] list = {‘m’, ‘e’, ‘y’};

System.out.println(Arrays.asList(list).indexOf(‘e’)); // print”1″

}

非常沉重的编辑。我想要么你想要这个:

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

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

}

第二个是如果你总是想要= 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″!我以为你想要实际上有不同的价值观,或者把东西存放在桶里。

我正在提供适当的方法来做这个

/**

* 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 list = new ArrayList(Arrays.asList(stringArray));

int index = list.indexOf(name);

list.clear();

return index;

}

return -1;

}

不要转换为ArrayList,也不要调用list.clear()。那些是多次迭代数组2。

如果元素的初始顺序不是很重要,你可以只对数组进行排序,然后二进制搜索它:

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。

这样你就可以使用最多’N’个字母。

char[] a={ ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ };

int indexOf=0;

for(int i=0;i

if(a[i] != ‘b’){

indexOf++;

}else{

System.out.println(“index of given:”+indexOf);

}}


版权声明:本文为weixin_32484447原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。