L'indice d'un élément dans un tableau à l'aide de Java
Le code suivant dans Java renvoie -1. Je pense qu'il doit être de retour 3.
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
Pouvez-vous m'aider à comprendre le fonctionnement de cette fonction.
Grâce
Arrays.asList
ne fonctionne pas pour des primitifs tableaux. Il donne uneList<int[]>
contenant l'originalint[]
. -1 signifie que le 4 n'est pas l'un desList
élémentsArrays.asList(int[])
est la création d'unList
d'un élément qui contient l'ensembleint[]
tableau. Changementint[]
àInteger[]
au lieu- En essayant d'écriture de type générique de
asList
explicitement (Arrays.<int>asList(array)
) plutôt que de compter sur l'inférence de type, et le compilateur va vous dire pourquoi cela ne fonctionne pas. - Goyavedu
Ints.asList()
les adresses de ce problème; plus d'infos.
Vous devez vous connecter pour publier un commentaire.
Avant Java 5,
Arrays.asList
utilisés pour accepter uneObject[]
. Lorsque les génériques et les varargs ont été introduits dans la langue cela a été changé pourDans votre exemple,
T
ne peut pas êtreint
parce queint
est un type primitif. Malheureusement, la signature correspond àT
égal àint[]
au lieu de cela, qui est un type de référence. Le résultat est que vous vous retrouvez avec unList
contenant un tableau, pas unList
d'entiers.En Java 4, votre code n'aurait pas compilé en raison d'une
int[]
n'est pas unObject[]
. Pas de compilation est préférable de produire un résultat étrange, et à la mise en Java, Josh Bloch dit rééquipementasList
être un varargs méthode a été une erreur.Arrays.asList
s'attendre à un objet (ou plus). Votre tableau (array
) est un seul objet, donc l'appel de la méthode permet de créer une liste d'un seul objet, qui est de votre tableau.Appel
indexOf
sur votre liste va retourner 1, car4
ne sera jamais trouvé que votre liste contient l'objet tableau, et non pas la liste de données que votre tableau contient.devriez faire ce que vous voulez tout en gardant l'original
int[]
.Vous obtenez une
IntStream
de, la boîte dans uneStream<Integer>
, les recueillir dans unList<Integer>
et puis peut faire un.indexOf()
de recherche.IntStream
au lieu de stocker l'ensemble de tableau dans la liste pour appelerindexOf
-OptionalInt index = IntStream.range(0, array.length).filter(i -> array[i] == 4).findFirst();
Vous avez des réponses quant à ce qui se passe à votre tableau lorsque vous utilisez
Arrays.asList()
.D'autres choses à prendre en compte:
Arrays.binarySearch()
int[]
à unList<Integer>
Exemple:
Résultats:
Depuis que vous êtes à l'aide d'un tableau de type primitif, cela ne fonctionnera pas. Le tableau est de type int. Étiez-vous à l'aide de
Integer
type, par exemple, qui va travailler.-1 signifie que l'indice de l'élément spécifié est introuvable.
C'est ce que vous voulez faire:
Vous ne pouvez pas utiliser les types primitifs comme les int en tant que paramètres de classes génériques en Java depuis l'int n'est pas une classe,il est recommandé de l'utiliser Entier plutôt :
de sortie:
noter que
Arraylist.indexOf(i)
retour à l'index de la première occurrence de l'élément je dans la liste :il sera de retour
2
qui est la première occurrence de l'élément 3 , pas3
puisqu'il y a 2 éléments de 3 dans la liste.Parce que quand vous faites cela avec un primaire de données de type tableau, il sera considéré comme le premier élément dans la Liste.
Vous obtiendrez ceci:
array
est considéré comme unObject
int[]
est particulièrementObject
et pasObject[]
Arrays.asList
vous avez besoin de zéro ou plusObjects
Votre méthode est appelée de cette façon,
De sorte que vous aurez
List<int[]>
et pasList<Integer>
Dans
Arrays.asList(1,2,3,4)
toutes les valeurs sont autoboxed dans leInteger
qui est uniquement unObject
donc, dans le cas ci-dessusInteger[]
cad faire l'affaire.