表像java数据结构

我需要实现一些类似于表的数据结构,在Java中存储这样的信息:

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

我必须能够通过sij参数对表进行排序。 我已经使用ArrayListHashMap进行了一些测试,但我不能让它们运行良好。

Google 番石榴库中有一个通用的TreeBasedTable类, TreeBasedTable您的要求。 它还提供了许多其他有用的实用方法,其用法显示在用户指南中 。

来自TreeBasedTable文档:

表的行键和列键按其自然顺序或提供的比较器排序的表的实现。

用法示例:

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

你是什​​么意思:

我必须能够通过sij参数对其进行排序

出了什么问题:

 Object [][] data 

编辑

好的,只是猜测你需要的是一个“StrangeDataStructure”来保存数组,并帮助你按第一列排序,那么你唯一需要的就是这样:

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

就是这样:你应该添加一个指示方向的排序方法,并使用“indexColumn”排序

我觉得这很简单(如果我理解你的“问题”

你知道吗? 我要实现它。

//时间过去了……

这里是:

 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 } 

输出:

 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, 

阅读Swing教程中有关如何使用表的部分 。 本教程将介绍如何创建表以及如何向表中添加排序function。

如果您只需要存储数据但不显示数据,则可以使用二维数组或列表列表。 然后,您可以使用Column Comparator进行排序。

编辑:添加了演示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) ); } } } 

我也同意创建一个Object来存储3个变量的建议。 在这种情况下,您可以使用可在上述链接中找到的BeanComparator

您可以使用Apache的MultiValueMap ,以便使用一个键链接多个值。

一种选择是创建一个包含3个变量的新对象,然后创建这些对象的数组/树,并按所需的参数排序。

这是一种方法:创建一个名为Row的对象来保存每一行,然后创建一个java.util.HashMap,其键是Integer sij,其值是相应的Rows。

 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 map = new TreeMap(); 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); } } } 

当它运行时,它产生:

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

如果我理解你的问题,你只需要一个Comparable类来表示一行。

 public static class Row implements Comparable { 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; } 

然后,您可以使用Row实例填充List ,并使用Collections.sort进行排序。