2015-07-31 25 views
17

Poniższy kod w języku Java zwraca -1. Myślałam, że powinien wrócić 3.Indeks elementu w tablicy przy użyciu Javy

int[] array = {1,2,3,4,5,6}; 
System.out.println(Arrays.asList(array).indexOf(4)); 

Pomożesz mi zrozumieć, jak ta funkcja działa.

Dzięki

+1

'Arrays.asList' nie działa dla prymitywnych tablic. Daje 'List ' zawierający oryginalne 'int []'. -1 oznacza, że ​​4 nie jest jednym z elementów "List" –

+0

'Arrays.asList (int [])' tworzy 'List' jednego elementu, który zawiera całą tablicę' int [] '. Zmień 'int []' na 'Integer []' zamiast – MadProgrammer

+0

Próbujesz jawnie pisać typowy 'asList' (' Arrays. asList (array) ') zamiast polegać na inferencji typów, a kompilator powie ci, dlaczego nie działa. –

Odpowiedz

8

Arrays.asList oczekiwać obiekt (lub więcej). Twoja tablica (array) jest jedynym obiektem, dlatego wywołanie metody utworzy listę tylko jednego obiektu, który jest twoją tablicą.

Wywołanie indexOf na liście spowoduje zwrócenie -1, ponieważ 4 nigdy nie zostanie znaleziony, ponieważ lista zawiera obiekt tablicy, a nie listę danych, które zawiera tablica.

3

Ponieważ używasz tablicy typu pierwotnego, to nie zadziała. Tablica jest typu int. Czy używałeś na przykład typu Integer, który zadziała. -1 oznacza, że ​​nie znaleziono indeksu określonego elementu.

To jest to, co chcesz zrobić:

Integer[] array = {1,2,3,4,5,6}; 
System.out.println(Arrays.asList(array).indexOf(4)); 
13

Przed Java 5, Arrays.asList wykorzystywane do przyjęcia Object[]. Kiedy rodzajowych i varargs zostały wprowadzone na język ten został zmieniony na

public static <T> List<T> asList(T... arr) 

W przykładzie T nie może być int ponieważ int to prymitywny typ. Niestety, podpis jest zgodny z T równym int[] zamiast tego, który jest typem odniesienia. W rezultacie otrzymujemy List zawierający tablicę, a nie liczbę całkowitą.

W języku Java 4 Twój kod nie zostałby skompilowany, ponieważ int[] nie jest Object[]. Nie kompilacja jest lepsza od dziwnego wyniku, a w Efektywnej Javie, Josh Bloch mówi, że doposażenie w metodę varargs było błędem.

2

Ponieważ po wykonaniu tej czynności z macierzą typów danych pierwotnych, będzie ona traktowana jako pierwszy element na liście.

int[] array = {1,2,3,4,5,6}; 
System.out.println(Arrays.asList(array)); 

Dostaniesz to:

[[[email protected]] 
4

masz odpowiedź jak na to, co dzieje się na swojej tablicy podczas korzystania Arrays.asList().

Inne rzeczy do rozważenia:

  • Ponieważ tablica jest posortowana, należy rozważyć Arrays.binarySearch()
  • Jeśli tablica nie jest posortowana, prosty zwyczaj metoda indexOf może wykonywać takie same, bez marnowania cykli przeliczania int[] Do List<Integer>

przykład:

public static void main(String[] args) throws Exception { 
    int[] array = {1, 2, 3, 4, 5, 6}; 
    System.out.print("Binary Search: "); 
    System.out.println(Arrays.binarySearch(array, 4)); 

    int[] array2 = {5, 8, 2, 5, 3, 4, 1}; 
    System.out.print("Manual Search: "); 
    System.out.println(indexOf(array2, 4)); 
} 

public static int indexOf(int[] array, int search) { 
    for (int i = 0; i < array.length; i++) { 
     if (array[i] == search) { 
      return i; 
     } 
    } 
    return -1; 
} 

Wyniki:

Binary Search: 3 
Manual Search: 5 
2
int[] array = {1,2,3,4,5,6}; 
  • w Javie array jest traktowana jako Object
  • int[] jest szczególnie Object i nie Object[]
  • Aby połączyć Arrays.asList potrzeba zero lub więcej Objects

Twoja metoda jest wywoływana w ten sposób

Arrays.asList((Object)(array));//Yes 
Arrays.asList(1,2,3,4,5,6);//No 

Więc trzeba będzie List<int[]> a nie List<Integer>

Teraz można prosić siebie, że jeśli Arrays.asList(1,2,3,4) roboty niż dlaczego nie Arrays.asList(arrayInt)?

W Arrays.asList(1,2,3,4) wszystkie wartości są autoboxed się do Integer który stanowi wyłącznie Object więc w powyższym przypadku Integer[] cad rade.

3

Nie można używać prymitywnych typów, takich jak int jako parametry do klas rodzajowych w Javie od int nie jest klasa, ty powinien użyć Integer zamiast:

Integer[] array = {1,2,3,3,4,5}; 

List Arraylist=Arrays.asList(array); 
System.out.println(Arraylist.indexOf(1)); 
System.out.println(Arraylist.indexOf(4)); 

wyjściowa:

0 
4 

pamiętać, że Arraylist.indexOf(i) zwraca indeks pierwszego wystąpienia elementu i na liście:

System.out.println(Arraylist.indexOf(3)); 

to zwróci 2, które jest pierwszym wystąpieniem elementu 3, a nie 3, ponieważ istnieją 2 elementy z 3 na liście.

5
int[] array = {1,2,3,4,5,6}; 
Arrays.stream(array).boxed().collect(Collectors.toList()).indexOf(4); 

powinien zrobić, co chcesz, zachowując oryginalny int[].

masz IntStream od niego pudełko go do Stream<Integer>, zbierać je do List<Integer> a następnie można wykonać wyszukiwanie .indexOf().

+2

Możesz chcieć użyć 'IntStream' zamiast zapisywania całej tablicy w liście dla wywołania' indexOf' - 'OptionalInt index = IntStream.range (0, array.length) .filter (i -> array [i] = = 4) .findFirst(); ' –

Powiązane problemy