Soy nuevo en Java y estoy muy confundido.
Tengo un gran conjunto de datos de longitud 4 int[]
y quiero contar la cantidad de veces que ocurre cada combinación particular de 4 enteros. Esto es muy similar a contar frecuencias de palabras en un documento.
Quiero crear un Map<int[], double>
que asigne cada int [] a un recuento continuo a medida que la lista se repite, pero Map no toma tipos primitivos.
entonces hice Map<Integer[], Double>
mis datos se almacenan como un ArrayList<int[]>
modo, mi ciclo debería ser algo así como
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);
}
}
No estoy seguro de qué código necesito en el comentario para que esto funcione para convertir un int[]
a un Integer[]
. O tal vez estoy fundamentalmente confundido acerca de la forma correcta de hacer esto.
java
arrays
generics
collections
Jonik
fuente
fuente
Respuestas:
Java 8 nativo (una línea)
Con Java 8,
int[]
se puede convertirInteger[]
fácilmente:Como otros han dicho,
Integer[]
generalmente no es una buena clave de mapa. Pero en lo que respecta a la conversión, ahora tenemos un código relativamente limpio y nativo.fuente
List<Integer> list = IntStream.of(q).boxed().collect(Collectors.toList());
Integer[]
, en realidad sugeriría usar la siguiente sintaxis:Integer[] boxed = IntStream.of(unboxed).boxed().toArray();
De la misma manera que @NwDxIntStream.of
llama deArrays.stream
todos modos. Creo que todo se reduce a la preferencia personal: prefiero una función anulada, a algunos les encanta usar clases más explícitas.the "new" method (constructor) of the Integer[] class
.Si desea convertir un
int[]
a unInteger[]
, no hay una forma automática de hacerlo en el JDK. Sin embargo, puedes hacer algo como esto:Si tiene acceso a la biblioteca lang de Apache , puede usar el
ArrayUtils.toObject(int[])
método de esta manera:fuente
value
mientras la variable de indexacióni
está allí.for (int i...)
bucle tradicional sería más eficiente aquí.Presumiblemente, desea que la clave del mapa coincida con el valor de los elementos en lugar de la identidad de la matriz. En ese caso, desea algún tipo de objeto que defina
equals
yhashCode
como era de esperar. Lo más fácil es convertir a un usoList<Integer>
, ya sea unoArrayList
o mejorArrays.asList
. Mejor que eso, puede introducir una clase que represente los datos (similar a,java.awt.Rectangle
pero recomiendo que las variables sean privadas finales y la clase final también).fuente
Usando for-loop regular sin bibliotecas externas:
Convierta int [] a Integer []:
Convertir entero [] a int []:
fuente
Me equivoqué en una respuesta anterior. La solución adecuada es usar esta clase como clave en el mapa que envuelve el int [] real.
y cambia tu código así:
fuente
Convierta int [] a Integer []
Convertir entero [] a int []
fuente
newArray[i] = ids[i];
y en el segundonewArray[i] = WrapperArray[i]
:)En lugar de escribir su propio código, puede usar un IntBuffer para ajustar el int [] existente sin tener que copiar los datos en una matriz Integer
IntBuffer implementa herramientas comparables para que pueda usar el código que ya ha escrito. Formalmente, los mapas comparan claves de manera que a.equals (b) se usa para decir que dos claves son iguales, por lo que dos IntBuffers con matriz 1,2,3, incluso si las matrices están en diferentes ubicaciones de memoria, se dice que son iguales y también lo serán trabaja para tu código de frecuencia.
}
Espero que ayude
fuente
No estoy seguro de por qué necesita un Doble en su mapa. En términos de lo que estás tratando de hacer, ¿tienes un int [] y solo quieres contar cuántas veces ocurre cada secuencia? ¿Por qué esto requeriría un Doble de todos modos?
Lo que haría es crear un contenedor para la matriz int con los métodos .equals y .hashCode adecuados para tener en cuenta el hecho de que el objeto int [] en sí mismo no considera los datos en su versión de estos métodos.
Y luego use el multiset de google guava, que tiene el propósito exacto de contar las ocurrencias, siempre que el tipo de elemento que ingrese tenga los métodos .equals y .hashCode adecuados.
Luego, para obtener el recuento de cualquier combinación particular:
fuente
IntArrayWrapper
Definitivamente, este es el enfoque correcto para usar unaint[]
matriz como clave hash, pero debe mencionarse que ese tipo ya existe ... Puede usarlo para envolver una matriz y no solo lo tienehashCode
eequals
incluso es comparable.Actualización: aunque se compila a continuación, arroja un
ArrayStoreException
en tiempo de ejecución. Demasiado. Dejaré que se quede para futuras referencias.Convertir an
int[]
, a anInteger[]
:Debo admitir que me sorprendió un poco que esto se compila, dado que
System.arraycopy
es de bajo nivel y todo, pero lo hace. Al menos en java7.Puede convertir a la inversa con la misma facilidad.
fuente
¡Funcionó como por arte de magia!
fuente
Convierta int [] a Integer []:
fuente
no necesitas
int[]
es un objeto y se puede usar como clave dentro de un mapa.es la definición adecuada del mapa de frecuencias.
Esto estaba mal :-). La solución adecuada también se publica :-).
fuente
frequencies.containsKey(q)
que siempre sería falso incluso si tengoput
la misma matriz dos veces. ¿Hay algún problema aquí que implique la definición de igualdad de Java con int [] 's?Simplemente use:
fuente