Comment convertir int [] en entier [] en Java?

Je suis nouveau en Java et très confus.

j'ai un grand jeu de données de longueur 4 int[] et je veux compter le nombre de fois que chaque combinaison de 4 entiers se produit. C'est très similaire à compter les fréquences de mots dans un document.

je veux créer un Map<int[], double> qui mappe chaque int[] à un compte courant alors que la liste est itérée, mais Map ne prend pas les types primitifs.

donc j'ai fait Map<Integer[], Double>

mes données sont stockées comme un ArrayList<int[]> donc ma boucle doit ê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 quel code j'ai besoin au commentaire pour faire ce travail de convertir un int[] en un Integer[] . Ou peut-être que je suis fondamentalement confus sur la bonne façon de le faire.

111
demandé sur Jonik 2009-05-19 05:24:22

12 réponses

Java natif 8 (une ligne)

avec Java 8, int[] peut être converti en Integer[] facilement:

int[] data = {1,2,3,4,5,6,7,8,9,10};

// To boxed array
Integer[] what = Arrays.stream( data ).boxed().toArray( Integer[]::new );
Integer[] ever = IntStream.of( data ).boxed().toArray( Integer[]::new );

// To boxed list
List<Integer> you  = Arrays.stream( data ).boxed().collect( Collectors.toList() );
List<Integer> like = IntStream.of( data ).boxed().collect( Collectors.toList() );

comme d'autres l'ont dit, Integer[] n'est habituellement pas une bonne clé de carte. Mais en ce qui concerne la conversion, nous avons maintenant un code relativement propre et natif.

106
répondu Sheepy 2015-10-22 02:19:27

si vous voulez convertir un int[] en un Integer[] , il n'y a pas de méthode automatisée pour le faire dans le JDK. Cependant, vous pouvez faire quelque chose comme ceci:

int[] oldArray;

... // Here you would assign and fill oldArray

Integer[] newArray = new Integer[oldArray.length];
int i = 0;
for (int value : oldArray) {
    newArray[i++] = Integer.valueOf(value);
}

si vous avez accès à la bibliothèque Apache lang , alors vous pouvez utiliser la méthode ArrayUtils.toObject(int[]) comme ceci:

Integer[] newArray = ArrayUtils.toObject(oldArray);
69
répondu Eddie 2012-11-09 19:58:30

vous voulez probablement 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 et hashCode comme vous vous y attendiez. Le plus facile est de convertir en un List<Integer> , soit un ArrayList ou mieux utiliser Arrays.asList . Mieux que cela, vous pouvez introduire une classe qui représente les données (similaire à java.awt.Rectangle mais je recommande de faire les variables privé final, et la classe final trop.)

8
répondu Tom Hawtin - tackline 2009-05-19 01:34:38

j'avais tort dans une réponse précédente. La bonne solution est d'utiliser cette classe comme une clé dans la carte d'emballage le réel int[].

public class IntArrayWrapper {
        int[] data;

        public IntArrayWrapper(int[] data) {
            this.data = data;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            IntArrayWrapper that = (IntArrayWrapper) o;

            if (!Arrays.equals(data, that.data)) return false;

            return true;
        }

        @Override
        public int hashCode() {
            return data != null ? Arrays.hashCode(data) : 0;
        }
    }

et changez votre code comme ceci:

   Map<IntArrayWrapper, Double > freqs = new HashMap<IntArrayWrapper, Double>();

    for (int[] data : datas) {
        IntArrayWrapper wrapper = new IntArrayWrapper(data);

        if ( freqs.containsKey(wrapper)) {
            freqs.put(wrapper, freqs.get(wrapper) + p);
        }

        freqs.put(wrapper, p);
    }
6
répondu Mihai Toader 2009-05-19 01:52:10

utilisant la boucle régulière sans bibliothèques externes:

convertir int [] en entier []:

int[] primitiveArray = {1, 2, 3, 4, 5};
Integer[] objectArray = new Integer[primitiveArray.length];

for(int ctr = 0; ctr < primitiveArray.length; ctr++) {
    objectArray[ctr] = Integer.valueOf(primitiveArray[ctr]); // returns Integer value
}

Convertir Integer[] int[]:

Integer[] objectArray = {1, 2, 3, 4, 5};
int[] primitiveArray = new int[objectArray.length];

for(int ctr = 0; ctr < objectArray.length; ctr++) {
    primitiveArray[ctr] = objectArray[ctr].intValue(); // returns int value
}
6
répondu silver 2015-05-08 01:02:52
  1. Convertir en int[] pour Integer[]

    public static Integer[] toConvertInteger(int[] ids) {
    
      Integer[] newArray = new Integer[ids.length];
         for (int i = 0; i < ids.length; i++) {
           newArray[i] = Integer.valueOf(ids[i]);
         }
       return newArray;
    }
    
  2. Convertir Integer[] int[]

    public static int[] toint(Integer[] WrapperArray) {
    
       int[] newArray = new int[WrapperArray.length];
          for (int i = 0; i < WrapperArray.length; i++) {
             newArray[i] = WrapperArray[i].intValue();
          }
       return newArray;
    }
    
4
répondu Harsh 2015-08-12 14:08:40

plutôt que d'écrire votre propre code, vous pouvez utiliser un IntBuffer pour envelopper l'int existant[] sans avoir à copier les données dans un tableau entier

int[] a = {1,2,3,4};
IntBuffer b = IntBuffer.wrap(a);

intbuffer met en œuvre comparables de sorte que vous êtes en mesure d'utiliser le code que vous avez déjà écrit. Les cartes comparent formellement les clés de telle sorte que A. equals (b) est utilisé pour dire que deux clés sont égales, donc deux IntBuffers avec le tableau 1,2,3-même si les tableaux sont dans des emplacements de mémoire différents - sont dits égaux et donc fonctionneront pour votre code de fréquence.

ArrayList<int[]> data = ... // load a dataset`

Map<IntBuffer, Double> frequencies = new HashMap<IntBuffer, Double>();

for(int[] a : data) {

    IntBuffer q = IntBuffer.wrap(a);

    if(frequencies.containsKey(q)) {
        frequencies.put(q, tfs.get(q) + p);
    } else {
        frequencies.put(q, p);
    }

}

L'espoir qui aide

3
répondu Chris 2009-05-19 12:14:45

Je ne sais pas pourquoi vous avez besoin d'un Double dans votre carte. En ce qui concerne 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écessiterait-il un Double de toute façon?

ce que je ferais est de créer un wrapper pour le tableau int avec un bon .d'égal à égal et .les méthodes hashCode 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.

public class IntArrayWrapper {
    private int values[];

    public IntArrayWrapper(int[] values) {
        super();
        this.values = values;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + Arrays.hashCode(values);
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        IntArrayWrapper other = (IntArrayWrapper) obj;
        if (!Arrays.equals(values, other.values))
            return false;
        return true;
    }

}

et puis utiliser le multiset de google guava, qui est destiné exactement dans le but de compter les occurences, aussi longtemps que le type d'élément que vous mettez dedans il a APPROPRIÉ .d'égal à égal et .les méthodes hashCode.

List<int[]> list = ...;
HashMultiset<IntArrayWrapper> multiset = HashMultiset.create();
for (int values[] : list) {
    multiset.add(new IntArrayWrapper(values));
}

ensuite, pour obtenir le compte pour n'importe quelle combinaison particulière:

int cnt = multiset.count(new IntArrayWrapper(new int[] { 0, 1, 2, 3 }));
2
répondu Matt 2012-08-03 12:29:54

Update: malgré les compilations ci-dessous, il lance un ArrayStoreException à l'exécution. Trop mauvais. Je vais le laisser pour référence future.


conversion d'un int[] , en un Integer[] :

int[] old;
...
Integer[] arr = new Integer[old.length];
System.arraycopy(old, 0, arr, 0, old.length);

je dois admettre que j'ai été un peu surpris que ce compile, étant donné que System.arraycopy est peu élevé et tout, mais il le fait. Au moins à java7.

vous pouvez convertir l'autre de façon tout aussi facilement.

1
répondu Thomas Ahle 2012-09-12 22:19:25

cela a fonctionné comme un charme!

int[] mInt = new int[10];
Integer[] mInteger = new Integer[mInt.length];

List<Integer> wrapper = new AbstractList<Integer>() {
    @Override
    public int size() {
        return mInt.length;
    }

    @Override
    public Integer get(int i) {
        return mInt[i];
    }
};

wrapper.toArray(mInteger);
1
répondu Itamar Borges 2016-06-12 14:16:24

vous n'avez pas besoin. int[] est un objet, et peut être utilisé comme une clé, une carte.

Map<int[], Double> frequencies = new HashMap<int[], Double>();

est la définition correcte de la carte des fréquences.

C'était faux :-). La bonne solution est aussi affichée: -).

-1
répondu Mihai Toader 2009-05-19 01:54:06

utilisation simple:

public static int[] intArrayToIntegerArray(Integer[] array)
    {
        int[] g = new int[array.length];
        for(int i = 0; i < array.length; i++){
            g[i] = array[i];
        }
        return g;
    }
-1
répondu user6765242 2016-11-17 18:51:07