Как найти индекс элемента в массиве в Java?
Я ищу, чтобы найти индекс данного элемента, зная его содержимое, в Java.
Я попробовал следующий пример, который не работает:
class masi {
public static void main( String[] args ) {
char[] list = {'m', 'e', 'y'};
// should print 1
System.out.println(list[] == "e");
}
}
Может кто-нибудь объяснить, что не так с этим и что мне нужно сделать, чтобы исправить это?
Ответы
Ответ 1
В этом случае вы можете создать новую строку String из своего массива символов, а затем сделать indeoxOf ( "e" ) в этой строке:
System.out.println(new String(list).indexOf("e"));
Но в других случаях примитивных типов данных вам придется перебирать его.
Ответ 2
Это даже не действительный синтаксис. И вы пытаетесь сравнить со строкой. Для массивов вам придется самостоятельно пройти массив:
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'));
Ответ 3
Я считаю, что самый лучший способ - это вручную перебирать массив.
for (int i = 0; i < list.length; i++) {
if (list[i] == 'e') {
System.out.println(i);
break;
}
}
Ответ 4
В качестве альтернативы вы можете использовать Commons Lang ArrayUtils класс:
int[] arr = new int{3, 5, 1, 4, 2};
int indexOfTwo = ArrayUtils.indexOf(arr, 2);
Существуют перегруженные варианты метода indexOf()
для разных типов массивов.
Ответ 5
Для примитивных массивов
Начиная с 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
на нем создает список одного элемента, который является данным массивом, а не списком элементов массива.
Ответ 6
Проблема с вашим кодом заключается в том, что когда вы делаете
list[] == "e"
вы спрашиваете, равен ли объект массива (а не содержимое) строке "e", что явно не так.
Вы хотите перебрать содержимое, чтобы выполнить требуемый чек:
for(String element : list) {
if (element.equals("e")) {
// do something here
}
}
Ответ 7
Теперь он печатает 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"
является строковым объектным литералом (который представляет собой строковый объект)
Пока
'е'
Является символьным литералом (который представляет собой примитивный тип данных символа)
Даже когда
list[]
Было бы корректным Java (что не так), сравнивая элемент символа со строковым элементом, так или иначе возвращающим false.
Просто используйте эту строковую функцию indexOf, и вы можете найти любой символ в любом алфавите (или массиве символов)
Ответ 8
Очень сильно отредактировано. Я думаю, что вы этого хотите:
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'];
}
}
(Обратите внимание, что вам, возможно, придется настроить метод init, если вы хотите использовать 1-26 вместо 0-25)
или вы хотите:
int getLetterPossitionInAlphabet(char c) {
return c - 'a' + 1
}
Во-вторых, если вы всегда хотите a = 1, z = 26. Первый позволит вам вставить строку типа "qwerty" и назначить q = 0, w = 1, e = 2, r = 3...
Ответ 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
Если начальный порядок элементов не очень важен, вы можете просто отсортировать массив, а затем binarySearch it:
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') );
}
}
Ответ 11
Я предоставляю правильный метод для этого.
/**
* 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;
}