Je suis nouveau sur Java et très confus.
J'ai un grand ensemble de données de longueur 4 int[]
et je veux compter le nombre de fois que chaque combinaison particulière de 4 entiers se produit. Ceci est très similaire au comptage des fréquences de mots dans un document.
Je veux créer un Map<int[], double>
qui mappe chaque int [] à un décompte au fur et à mesure que la liste est itérée, mais Map ne prend pas les types primitifs.
alors j'ai fait Map<Integer[], Double>
mes données sont stockées comme un ArrayList<int[]>
donc ma boucle devrait être quelque chose comme
ArrayList<int[]> data = ... // load a dataset`
Map<Integer[], Double> frequencies = new HashMap<Integer[], Double>();
for(int[] q : data) {
// **DO SOMETHING TO convert q from int[] to Integer[] so I can put it in the map
if(frequencies.containsKey(q)) {
frequencies.put(q, tfs.get(q) + p);
} else {
frequencies.put(q, p);
}
}
Je ne suis pas sûr de ce code que je dois au commentaire à faire ce travail pour convertir un int[]
à un Integer[]
. Ou peut-être que je suis fondamentalement confus quant à la bonne façon de procéder.
la source
Réponses:
Java 8 natif (une ligne)
Avec Java 8,
int[]
peut être convertiInteger[]
facilement en:Comme d'autres l'ont indiqué, ce
Integer[]
n'est généralement pas une bonne clé de carte. Mais en ce qui concerne la conversion, nous avons maintenant un code relativement propre et natif.la source
List<Integer> list = IntStream.of(q).boxed().collect(Collectors.toList());
Integer[]
je suggérerais en fait d'utiliser la syntaxe suivante:Integer[] boxed = IntStream.of(unboxed).boxed().toArray();
De la même manière que @NwDxIntStream.of
appelleArrays.stream
quand même. Je pense que cela se résume à une préférence personnelle - je préfère une fonction remplacée, certains aiment utiliser une classe plus explicite.the "new" method (constructor) of the Integer[] class
.Si vous souhaitez convertir un
int[]
en unInteger[]
, il n'existe pas de moyen automatisé de le faire dans le JDK. Cependant, vous pouvez faire quelque chose comme ceci:Si vous avez accès à la bibliothèque Apache lang , vous pouvez utiliser la
ArrayUtils.toObject(int[])
méthode comme celle-ci:la source
value
que la variable d'indexationi
est là.for (int i...)
boucle traditionnelle serait plus efficace ici.Vraisemblablement, vous voulez que la clé de la carte corresponde à la valeur des éléments au lieu de l'identité du tableau. Dans ce cas, vous voulez une sorte d'objet qui définit
equals
ethashCode
comme vous vous en doutez. Le plus simple est de convertir en uneList<Integer>
, uneArrayList
ou une meilleure utilisationArrays.asList
. Mieux que cela, vous pouvez introduire une classe qui représente les données (similairejava.awt.Rectangle
mais je recommande de rendre les variables privées finales, et la classe finale aussi).la source
Utilisation de la boucle for régulière sans bibliothèques externes:
Convertissez un entier [] en un entier []:
Convertir un entier [] en un entier []:
la source
J'avais tort dans une réponse précédente. La bonne solution consiste à utiliser cette classe comme clé dans la carte encapsulant le véritable int [].
et changez votre code comme ceci:
la source
Convertir un entier [] en un entier []
Convertir un entier [] en un entier []
la source
newArray[i] = ids[i];
et dans le 2èmenewArray[i] = WrapperArray[i]
:)Plutôt que d'écrire votre propre code, vous pouvez utiliser un IntBuffer pour encapsuler l'int [] existant sans avoir à copier les données dans un tableau Integer
IntBuffer implémente des outils comparables afin que vous puissiez utiliser le code que vous avez déjà écrit. Mappe formellement les clés de comparaison telles que a.equals (b) est utilisé pour dire que deux clés sont égales, donc deux IntBuffers avec un tableau 1,2,3 - même si les tableaux sont dans des emplacements de mémoire différents - sont dits égaux et le sera travailler pour votre code de fréquence.
}
J'espère que cela pourra aider
la source
Je ne sais pas pourquoi vous avez besoin d'un double dans votre carte. En termes de ce que vous essayez de faire, vous avez un int [] et vous voulez juste compter combien de fois chaque séquence se produit? Pourquoi cela nécessitait-il un Double de toute façon?
Ce que je ferais est de créer un wrapper pour le tableau int avec les méthodes .equals et .hashCode appropriées pour tenir compte du fait que l'objet int [] lui-même ne considère pas les données dans sa version de ces méthodes.
Et puis utilisez le multiset de google guava, qui est destiné exactement à compter les occurrences, à condition que le type d'élément que vous y mettez ait les méthodes .equals et .hashCode appropriées.
Ensuite, pour obtenir le décompte d'une combinaison particulière:
la source
IntArrayWrapper
certainement la bonne approche pour utiliser unint[]
tableau comme clé de hachage, mais il faut mentionner qu'un tel type existe déjà … Vous pouvez l'utiliser pour envelopper un tableau et non seulement l'avoirhashCode
etequals
, c'est même comparable.Mise à jour: bien que ce qui suit compile, il lance un
ArrayStoreException
à l'exécution. Dommage. Je vais le laisser pour référence future.Conversion d'un
int[]
, en unInteger[]
:Je dois admettre que j'ai été un peu surpris que cela compile,
System.arraycopy
étant donné le niveau inférieur et tout, mais c'est le cas. Au moins en java7.Vous pouvez convertir dans l'autre sens tout aussi facilement.
la source
Cela a fonctionné comme un charme!
la source
Convertissez un entier [] en un entier []:
la source
vous n'en avez pas besoin.
int[]
est un objet et peut être utilisé comme clé à l'intérieur d'une carte.est la bonne définition de la carte des fréquences.
C'était faux :-). La bonne solution est également affichée :-).
la source
frequencies.containsKey(q)
serait toujours faux même si j'aiput
le même tableau deux fois - y a-t-il un problème impliquant la définition de l'égalité de Java avec les int []?Utilisez simplement:
la source