我有一个我创建的节点类,它有一个行,列和数据的int。我正在尝试制作一个稀疏矩阵。我想对它们进行排序,因为我将它们添加为更高效。我首先需要按行排序,然后按列排序,如果行相同。我尝试了几种不同的方法,但没有一种方法可行。我正在使用Java linkedList类以及Iterator。例如,如果添加元素(1,1,3),(2,2,4)和(1,3,5),当我打印出来时,它应该是(1,1,3),(1 ,3,5)和(2,2,4)。
到目前为止,这是我的代码:
public void addElement(int row, int col, int data) {
if(matrix.size() == 0){
Node new_node = new Node(row, col, data);
matrix.add(new_node);
System.out.print("test \n");
}
Iterator<Node> iterator = matrix.iterator();
Node temp = new Node();
temp = iterator.next();
int i = -1; // counter
int size = matrix.size();
int node_row = temp.getRow();
int node_col = temp.getColumn();
System.out.print("iterator test \n");
while(iterator.hasNext() || size == 1){
System.out.print("test 5");
while(row>node_row){
i++;
node_row++;
}
while(row == node_row && col>node_col){
i++;
node_col++;
}
break;
}
if(i<=0){
Node new_node = new Node(row, col, data);
matrix.add(0, new_node);
}
else{
Node new_node = new Node(row, col, data);
matrix.add(i, new_node);
}
}
感谢您的帮助!!
答案 0 :(得分:1)
我的解决方案实现了一个自定义插入方法,将要插入的元素,要插入的List(任何List实现)和要使用的Comparator。您可能应该使用二进制搜索方法优化插入逻辑,但至少它很容易理解。这假定传入列表中的任何元素已经排序。
public class SortMatrixCells
{
static class Cell<T>
{
private int column;
private int row;
private T value;
Cell(int row, int column, T value)
{
this.row = row;
this.column = column;
this.value = value;
}
public String toString()
{
return String.format("[%s,%s,%s]", row, column, value);
}
}
private final static Comparator<Cell> cellComparator = new Comparator<Cell>() {
@Override
public int compare(Cell c1, Cell c2)
{
int result = 0;
// Compare row values.
if (c1.row < c2.row)
{
result = -1;
}
else if (c1.row > c2.row)
{
result = 1;
}
// If rows are equal, compare column values.
else
{
if (c1.column < c2.column)
{
result = -1;
}
else if (c1.column > c2.column)
{
result = 1;
}
}
return result;
}
};
public static void main(String[] args)
{
List<Cell<Integer>> matrixCells = new ArrayList<>();
insert(new Cell<Integer>(2, 2, 4), matrixCells, cellComparator);
System.out.println("List so far: " + matrixCells);
insert(new Cell<Integer>(1, 3, 5), matrixCells, cellComparator);
System.out.println("List so far: " + matrixCells);
insert(new Cell<Integer>(1, 1, 3), matrixCells, cellComparator);
System.out.println("List so far: " + matrixCells);
}
private static <T> void insert(T elementToInsert, List<T> list, Comparator comparator)
{
boolean inserted = false;
ListIterator<T> itrElements = list.listIterator();
for (; itrElements.hasNext();)
{
int comparison = comparator.compare(elementToInsert, itrElements.next());
switch (comparison)
{
case -1:
case 0:
itrElements.previous();
itrElements.add(elementToInsert);
inserted = true;
break;
}
if (inserted)
{
break;
}
}
if (!inserted)
{
itrElements.add(elementToInsert);
}
}
}
还有一件事:除非你有一个压倒一切的理由在将它们添加到列表中时对它们进行排序,我建议你只需创建列表,并将所有元素添加到尾部。然后只需调用实现合并排序的Collections.sort (list, cellComparator)
。即使使用二进制搜索方法,这最终也应该比排序更高效。