Ordenar una matriz 2D por número de visitas

Tengo dos ArrayLists:

Array 01:

ArrayList uniqueFiletypes --> which contains unique filetypes (e.g .zip etc..)

Array 02:

ArrayList countFiletypes --> which counts how many of each filetype there is, for example 8 .zip's

Y pasar directamente a la pregunta:

Necesito hacer algún tipo de "clasificación", lo que significa que la mayor cantidad de tipos de archivos obtiene el primer lugar, etc.

Otro problema: debe ser un Objeto [] [] (para admitir JTable), por lo que es posible mostrar el resultado fácilmente.

Ejemplo de salida: tengo 8 .zips, 5 .java y 2 .docx

Object[][] = {{"1", ".zip", "8"},{"2", ".java", "5"}, {"3", ".docx", "2"}}

Donde {PLACE, FILETYPE, COUNT}

0

3 Respuestas

  • First approach: As you will work with JTable, Use TableRowSorter as shown in the demo example of tutorial page

  • Second approach: Assuming you need it not only for JTable

    Object[][] array = {{"1", ".zip", "8"},{"2", ".java", "5"}, {"3", ".docx", "2"}};
    Listdata = Arrays.asList(array);
    Comparatorcomparator = new Comparator() { @Override public int compare(Object[] o1, Object[] o2) { return ((String)o1[2]).compareTo((String)o2[2]); } }; Collections.sort(data, Collections.reverseOrder(comparator)); array = (Object[][]) data.toArray(); 
0
agregado

Supongo que el orden de los elementos en ambas listas coincide. Es decir. el primer elemento en la lista uniqueFiletypes tiene el número de hits igual al primer número en la lista countFiletypes.

Yo haría lo siguiente:

  1. Pasa por las listas y agrega las entradas a un Mapa. ​​

  2. Ordene la lista de countFiletypes en orden descendente.

  3. Extraiga los tipos de archivo del mapa y agréguelos en el orden en que se encuentran ahora en la lista ordenada.

Algo como lo siguiente podría hacer el truco:

public static void main(final String[] args) {
    final ArrayList uniqueFileTypes = new ArrayList();
    uniqueFileTypes.add(".java");
    uniqueFileTypes.add(".zip");
    uniqueFileTypes.add(".docx");

    final ArrayList countFileTypes = new ArrayList();
    countFileTypes.add(5);
    countFileTypes.add(8);
    countFileTypes.add(2);

    final Map countedFileTypes = new HashMap();

    for (int i = 0; i< uniqueFileTypes.size(); i++ ) {
        countedFileTypes.put(countFileTypes.get(i), uniqueFileTypes.get(i) );
    }

    Collections.sort(countFileTypes);
    Collections.reverse(countFileTypes);

    final Object[][] data = new Object[countedFileTypes.size()][3];

    for(int i = 0; i

El método principal y el sistema no son realmente necesarios, solo los utilicé para probar mi solución, que produjo esta salida:

{1,.zip,8}
{2,.java,5}
{3,.docx,2}

Por supuesto, esto implica un vínculo entre el número de visitas y el tipo de archivo que puede no ser cierto. Por ejemplo, si el formato de archivo docx y java tiene 9 hits, esta solución no funcionaría.

0
agregado
Tú eres el jefe @DanTemple. ¡Gracias!
agregado el autor Ole Reidar Holm, fuente
Estaba trabajando en un poco más de información relacionada con tu punto @ Tansir1. Sí, quise poner el mapa de un entero en una cadena ya que eso permite que el orden obtenga el valor correcto del mapa. Sin embargo, como acabo de agregar, esto significará que los recuentos deberán ser únicos. Usar las cadenas como el identificador es mejor. Para ser sincero, me pregunto si hay algo disponible en las clases de Colecciones Guava que sería útil aquí. BiMap quizás
agregado el autor Dan Temple, fuente
Sin preocupaciones. Sin embargo, tenga en cuenta que "si el docx y el formato de archivo java tienen 9 hits, esta solución no funcionaría". 9 siendo arbitrario, si tienen el mismo número de visitas, no funcionará.
agregado el autor Dan Temple, fuente
¿Estás seguro de que no quisiste desconectar String en el hashmap en lugar del número entero de tipos de archivos? Si se agrega un archivo nuevo o se elimina uno anterior, la clave para ese tipo de archivo cambia. Cuando se agrega el nuevo valor de clave en el mapa, tendrá dos asignaciones de teclas diferentes para el mismo valor de cadena. Utilizaría la cadena como una clave de identificación única y tendré el número entero como el valor de la variable.
agregado el autor Tansir1, fuente

Is it possible for you to merge the two ArrayLists to a single HashMap? This map can hold the entries consisting of the unique filetype (String) and its count (Integer). I suggest this because you have a direct link between a filetype and its count - this "link" can be expressed by a HashMap entry.

La conversión de HashMap a un objeto [] [] se puede hacer de esta manera:

for (Map.Entry<?,?> entry : map.entrySet()) {
    model.addRow(new Object[] { entry.getKey(), entry.getValue() });
}

Con la ordenación de HashMap también es más fácil, ya que no necesita manejar dos listas de arreglos independientes.

0
agregado