structures sheet data cheat and algorithms java data-structures

and - java data structures cheat sheet



Tabla como estructura de datos java (7)

Necesito implementar una estructura de datos tipo tabla similar que almacene información como esta en Java:

+--------+-------+-----+ | sij | i | j | +--------+-------+-----+ | 45 | 5 | 7 | +--------+-------+-----+ | 33 | 1 | 6 | +--------+-------+-----+ | 31 | 0 | 9 | +--------+-------+-----+ | 12 | 8 | 2 | +--------+-------+-----+

y tengo que ser capaz de ordenar la tabla por el parámetro sij . Hice algunas pruebas con ArrayList y HashMap , pero no puedo hacer que funcionen bien.


A qué te refieres con:

tengo que ser capaz de ordenarlo por el parámetro sij

Qué hay de malo en:

Object [][] data

EDITAR

Ok, solo adivinando que lo que necesitas es una "StrangeDataStructure" que contenga la matriz, y te ayude a clasificar por la primera columna, entonces lo único que necesitas es algo como esto:

class Structure { Object [][] data; Object [] indexColumn; // the sij? }

Y eso es todo: debe agregar un método de ordenación que indique la dirección, y ordenar con "indexColumn"

Es VENDEDOR simple, creo (y si entendí tu "pregunta" )

¿Sabes que? Voy a implementarlo.

// el tiempo pasa ...

Aquí está:

import java.util.Comparator; import java.util.Arrays; public class StrangeStructure { private Integer [][] data; private Integer [] sij; // what is sij anyway? public StrangeStructure( Integer [][] matrix ) { data = matrix; sij = new Integer[ data.length ]; for( int i = 0 ; i < data.length ; i++ ) { sij[i] = data[i][0]; } } public void sort( Direction direction ) { Comparator sijComparator = new DataComparator( direction, true ); Comparator dataComparator = new DataComparator( direction, false ); Arrays.sort( sij, sijComparator ); Arrays.sort( data, dataComparator ); } public static void main( String [] args ) { StrangeStructure s = new StrangeStructure( new Integer[][]{ { 45, 5, 7 }, { 33, 1, 6 }, { 31, 0, 9 }, { 12, 8, 2 } }); System.out.printf("Original:/n%s", s ); s.sort( Direction.MIN_TO_MAX ); System.out.printf("Min to max:/n%s", s ); s.sort( Direction.MAX_TO_MIN ); System.out.printf("Max to min/n%s", s ); } public String toString() { StringBuilder b = new StringBuilder(); for( Integer [] row : data ) { for( int i : row ) { b.append( i+","); } b.append("/n"); } return b.toString(); } } class DataComparator implements Comparator { private Direction direction; private boolean isSij; public DataComparator( Direction d, boolean isSij ) { this.direction = d; this.isSij = isSij; } public int compare( Object one , Object two ) { if( isSij ){ return doCompare( direction, (Integer) one, (Integer) two ); } else { return doCompare( direction, ((Integer[])one)[0], ((Integer[])two)[0]); } } public int doCompare( Direction d, int one, int two ) { int a = ( d == Direction.MIN_TO_MAX? one: two ); int b = ( d == Direction.MIN_TO_MAX? two: one ) ; return a - b; } public boolean equals( Object o ) { return false; } } enum Direction{ MIN_TO_MAX, MAX_TO_MIN }

Salida:

Original: 45,5,7, 33,1,6, 31,0,9, 12,8,2, Min to max: 12,8,2, 31,0,9, 33,1,6, 45,5,7, Max to min 45,5,7, 33,1,6, 31,0,9, 12,8,2,


Aquí hay una forma: crear un objeto llamado Fila para contener cada fila, y luego hacer un java.util.HashMap cuyas claves sean Integer sij y cuyos valores sean las Filas correspondientes.

public class Example { public static class Row { public Integer sij; public Integer i; public Integer j; public Row(Integer sij, Integer i, Integer j) { this.sij = sij; this.i = i; this.j = j; } } public static void main(String[] args) { Row r1 = new Row(45, 5, 7); Row r2 = new Row(33, 1, 6); Row r3 = new Row(31, 0, 9); Row r4 = new Row(12, 8, 2); Map<Integer, Row> map = new TreeMap<Integer, Row>(); map.put(r1.sij, r1); map.put(r2.sij, r2); map.put(r3.sij, r3); map.put(r4.sij, r4); for ( Row row : map.values() ) { System.out.println("sij: " + row.sij + " i: " + row.i + " j: " + row.j); } } }

Cuando esto se ejecuta produce:

sij: 12 i: 8 j: 2 sij: 31 i: 0 j: 9 sij: 33 i: 1 j: 6 sij: 45 i: 5 j: 7


Hay una clase genérica TreeBasedTable de la biblioteca de guava Google que hace exactamente lo que estás pidiendo. También ofrece muchos otros métodos útiles de utilidad y su uso se muestra en la guía del usuario .

De los documentos TreeBasedTable :

Implementación de la tabla cuyas claves de fila y columna están ordenadas por orden natural o por comparadores suministrados.

Ejemplo de uso:

RowSortedTable<Vertex, Vertex, Double> weightedGraph = TreeBasedTable.create(); weightedGraph.put(v2, v3, 4.0); weightedGraph.put(v1, v2, 20.0); System.out.println( weightedGraph.rowKeySet() ); // prints [v1, v2]


Lea la sección del tutorial Swing sobre Cómo usar tablas . El tutorial muestra cómo crear una tabla y cómo agregar capacidad de clasificación a la tabla.

Si solo necesita almacenar los datos pero no mostrarlos, puede usar una matriz bidimensional o una Lista de listas. Luego puede usar el Comparador de columnas para hacer la clasificación.

Editar: código agregado que demuestra el uso del ColumnComparator

import java.util.*; public class SortSIJ { public static void main(String args[]) { Object[] data = new Object[4]; data[0] = new Integer[] {45, 5, 7}; data[1] = new Integer[] {33, 1, 6}; data[2] = new Integer[] {31, 0, 9}; data[3] = new Integer[] {12, 8, 2}; ColumnComparator cc = new ColumnComparator(0); // cc.setAscending( false ); Arrays.sort(data, cc); for (Object row: data) { Integer[] theRow = (Integer[])row; System.out.println( Arrays.asList(theRow) ); } } }

También estoy de acuerdo con la sugerencia de crear un Objeto para almacenar las 3 variables. En este caso, puede usar BeanComparator que se puede encontrar en el enlace de arriba.


Puede usar MultiValueMap desde Apache para vincular múltiples valores con una clave.


Si entiendo bien tu pregunta, todo lo que necesitas es una clase Comparable para representar una fila.

public static class Row implements Comparable<Row> { public Row(int sij, int i, int j) { this.sij = sij; this.i = i; this.j = j; } public int compareTo(Row other) { return Integer.valueOf(sij).compareTo(other.sij); } public final int sij; public final int i; public final int j; }

A continuación, puede completar una List con instancias de Row y usar Collections.sort para ordenarla.


Una opción es crear un nuevo objeto que contenga las 3 variables, y luego crear una matriz / árbol de esos objetos y ordenarlos por el parámetro que desee.