簡體   English   中英

按特定順序對ArrayList中的值進行排序

[英]Sorting values in ArrayList in specific order

首先讓我解釋一下這種情況:

List<Row> rowValues = new ArrayList<>();

// After adding values into list
At location 0 = [Johnson, 10000]
At location 1 = [Adam, 12000]
At location 2 = [Mike, 11000]
At location 3 = [Johnson, 17000]
At location 4 = [Tony, 10000]

我想按升序對column1元素進行排序,並按降序對column2元素進行排序。 喜歡:

At location 0 = [Adam, 12000]
At location 1 = [Johnson, 17000]
At location 2 = [Johnson, 10000]
At location 3 = [Mike, 11000]
At location 4 = [Tony, 10000]

我不確定這是否可以通過使用以下方法實現:

Collections.sort(rowValues); //or
Collections.sort(rowValues, Collections.reverseOrder());

行類,如果有意義的話:

final class Row extends ArrayList<Object> implements Comparable<Row> {

    private int index;
    private Order order;


    Row(int initialCapacity) {
        super(initialCapacity);
        this.index = -1; //-1 indicates that the index has not been set
    }

    Object getSortingValue() {
        if (index == -1) {
            throw new IllegalStateException("Sorting column is unknown");
        } else if (isEmpty()) {
            throw new IllegalStateException("Row is empty");
        }
        return get(index);
    }

   void setSortingColumn(int index) throws IllegalArgumentException {
        if (index < 0) {
            throw new IllegalArgumentException("Invalid sorting index: " + index);
        }
        this.index = index;
    }

    Order getOrder() {
        return order;
    }

    void setOrder(Order order) {
        this.order = order;
    }

    @Override
    public int compareTo(Row row) {
        if (row == null) {
            throw new NullPointerException();
        }
        Object sortValue = getSortingValue();
        if (sortValue instanceof Comparable) {
            return ((Comparable) sortValue).compareTo(row.getSortingValue());
        } else {
            throw new IllegalArgumentException(sortValue + " not type of Comparable");
        }
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Row) {
            Row row = (Row) obj;
            return getSortingValue().equals(row.getSortingValue());
        }
        return false;
    }

    @Override
    public int hashCode() {
        return getSortingValue().hashCode();
    }
}

是的,您可以使用Collections.sort()對其進行排序,但是您需要定義自己的Comparator ,在其中,當第一行較大或相等時,第二行較大時定義一個對象大於其他對象。 。

您需要在compareTo()方法中考慮兩個列的值(對於兩個列),假設Row對象中的相應字段分別命名為name和point-

 public int compareTo(Row row) {
        if(!name.equals(row.getName()){
        return name.compareTo(row.getName());
        }
         return  -1 * point.compareTo(row.getPoint());
    }

我認為您想按名稱asc排序,如果名稱等於另一個,則按值desc排序。 如果是這樣的話

    List<Row> rowValues = new ArrayList<Row>();

    // After adding values into list
    rowValues.add(new Row("Johnson", 10000));
    rowValues.add(new Row("Adam", 12000));
    rowValues.add(new Row("Mike", 11000));
    rowValues.add(new Row("Johnson", 17000));
    rowValues.add(new Row("Tony", 10000));

    Collections.sort(rowValues, new RowComparator());

    System.out.println(rowValues);

public class Row {
    private String name;
    private Integer val;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getVal() {
        return val;
    }
    public void setVal(Integer val) {
        this.val = val;
    }
    public Row(String name, Integer val) {
        super();
        this.name = name;
        this.val = val;
    }
    @Override
    public String toString() {
        return "Row [name=" + name + ", val=" + val + "]";
    }

}

import java.util.Comparator;

public class RowComparator implements Comparator<Row> {

    public int compare(Row o1, Row o2) {
        if (o1.getName().equals(o2.getName())) {
            return -1 * o1.getVal().compareTo(o2.getVal());
        } else {
            return o1.getName().compareTo(o2.getName());
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM