如何根据两个对象参数对对象的链接列表进行排序?

时间:2018-02-07 21:14:19

标签: java sorting linked-list

我使用链表来表示稀疏矩阵,其中链表仅包含非零元素以及矩阵中的行和列,以便不浪费内存。

我需要能够根据它们的行然后列按顺序显示这些元素。例如,保存{data 5,row 2,col 0},{data 8,row 0,col 2},{data 1,row 0,col 1}的矩阵将打印出来:

0 1 1,0 2 8,2 0 5。

矩阵写为:

LinkedList<MatrixElement> matrix = new LinkedList<MatrixElement>();

元素类写成:

class MatrixElement {  //Data object for each node in list, holds value and location

private int data;
private int row;
private int col;

public MatrixElement(int row, int col, int data){
    this.data = data;
    this.row = row;
    this.col = col;
}

public int getData(){
    return data;
}

public int getRow(){
    return row;
}

public int getCol(){
    return col;

关于如何对其进行排序以便最终打印出来的任何反馈都将不胜感激。谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

您可以按行排序,然后按以下列排序:

matrix.sort(Comparator.comparingInt(MatrixElement::getRow) 
                      .thenComparingInt(MatrixElement::getCol));

答案 1 :(得分:0)

您可能需要考虑在Comparable类中实现MatrixElement接口。此外,值得考虑覆盖此类的toString()方法,以使其以更易读的方式打印结果。看看你如何实现这一目标:

class MatrixElement implements Comparable<MatrixElement> {

    //fields, constructor and getters...

    public String toString() {
        return "[row:" + this.getRow() + ", col:" + this.getCol() + ", data:" + this.getData() + "]";
    }

    @Override
    public int compareTo(MatrixElement me) {
        if(this.getRow() < me.getRow()) {
            return -1;
        } else if(this.getRow() > me.getRow()) {
            return 1;
        } // if getRow() is equal to both, proceed with comparing columns...
        if(this.getCol() < me.getCol()) {
            return -1;
        } else if(this.getCol() > me.getCol()) {
            return 1;
        } // if getCol() is equal to both, it returns 0
        return 0;
    }
}

在实施compareTo()方法后,使用Collections.sort()方法时,会使用compareTo()方法中提供的订单:

List<MatrixElement> elements = new ArrayList<>();
elements.add(new MatrixElement(5,2,0));
elements.add(new MatrixElement(8,0,2));
elements.add(new MatrixElement(1,0,1));
System.out.println(Arrays.toString(elements.toArray()));
Collections.sort(elements);
System.out.println(Arrays.toString(elements.toArray()));

输出你得到:

[[row:5, col:2, data:0], [row:8, col:0, data:2], [row:1, col:0, data:1]]
[[row:1, col:0, data:1], [row:5, col:2, data:0], [row:8, col:0, data:2]]