[英]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.