Sve*_*erd 25 java data-structures
我需要实现一些类似于表的数据结构,在Java中存储这样的信息:
+--------+-------+-----+
| sij | i | j |
+--------+-------+-----+
| 45 | 5 | 7 |
+--------+-------+-----+
| 33 | 1 | 6 |
+--------+-------+-----+
| 31 | 0 | 9 |
+--------+-------+-----+
| 12 | 8 | 2 |
+--------+-------+-----+
Run Code Online (Sandbox Code Playgroud)
我必须能够通过sij参数对表进行排序.我用ArrayList和做了一些测试HashMap,但是我不能让它们运行良好.
And*_*ejs 24
TreeBasedTableGoogle guava库中有一个通用类,可以满足您的要求.它还提供了许多其他有用的实用方法,其用法显示在用户指南中.
来自TreeBasedTable文档:
表的行键和列键按其自然顺序或提供的比较器排序的表的实现.
用法示例:
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]
Run Code Online (Sandbox Code Playgroud)
Osc*_*Ryz 18
你是什么意思:
我必须能够通过sij参数对其进行排序
有什么不对:
Object [][] data
Run Code Online (Sandbox Code Playgroud)
编辑
好吧,只是猜测你需要的是一个"StrangeDataStructure"来保存数组,并帮助你按第一列排序,那么你唯一需要的就是这样:
class Structure {
Object [][] data;
Object [] indexColumn; // the sij?
}
Run Code Online (Sandbox Code Playgroud)
就是这样:你应该添加一个指示方向的排序方法,并使用"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
}
Run Code Online (Sandbox Code Playgroud)
输出:
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,
Run Code Online (Sandbox Code Playgroud)