如何解决Guava TreeBasedTable - 按列排序
我正在尝试使用 Guava Table 和 TreeBaedTable 实现,并且我正在尝试按列名对表进行排序。这是我目前所拥有的:
import com.google.common.collect.Ordering;
import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class CustomTable {
enum SortDirection {
ASC,DESC,}
enum Column {
COL_1,COL_2,COL_3;
public static final Column[] columns = Column.values();
}
private final TreeBasedTable<Integer,Column,Integer> table;
public CustomTable() {
this.table = TreeBasedTable.create();
}
public Integer cell(int ID,Column column) {
return table.get(ID,column);
}
public void addRow(List<Integer> values) {
Integer rowNum = nextID();
for (int i = 0; i < values.size(); i++) {
table.put(rowNum,Column.columns[i],values.get(i));
}
}
public Table<Integer,Integer> sortBy(Column column,SortDirection sortDirection) {
Comparator<Integer> rowComparator = Comparator.comparing(id -> cell(id,column));
rowComparator = (sortDirection.equals(SortDirection.ASC)) ? rowComparator : rowComparator.reversed();
Table<Integer,Integer> table = TreeBasedTable.create(rowComparator,Ordering.natural());
table.putAll(table);
return table;
}
public String toString() {
return table.toString();
}
public int maxID() {
return table.rowKeySet().size();
}
public int nextID() {
return maxID() + 1;
}
}
和示例用法:
CustomTable table = new CustomTable();
table.addRow(Arrays.asList(1,2,3));
table.addRow(Arrays.asList(6,7,8));
table.addRow(Arrays.asList(4,5,6));
System.out.println(table.sortBy(Column.COL_2,SortDirection.DESC));
现在,当单元格具有不同的值时,这会按预期工作。但是,如果两个单元格具有相同的值,则省略后者。
我已尝试使用以下比较器解决此问题:
Comparator<Integer> rowComparator = (id1,id2) -> {
Integer cell1 = cell(id1,column);
Integer cell2 = cell(id2,column);
if (cell1 != cell2)
return cell1.compareTo(cell2);
return -1; // So,row id1 appears above the row id2.
};
但这会产生一些不需要的表格突变。有什么我遗漏的吗?
解决方法
使用打印语句,我注意到当两个不同的单元格具有相同的值时,ID 会根据自身进行检查,即 id1 == id2
。解决方案是捕获这种情况并返回 0
(当两个 Integer
对象具有相同的值时)。
使用的比较器是:
Comparator<Integer> valueComparator = (id1,id2) -> {
if (id1.equals(id2))
return 0;
Integer cell1 = cell(id1,column);
Integer cell2 = cell(id2,column);
if (cell1.equals(cell2))
return 1;
return cell1.compareTo(cell2);
};
它按预期工作;当两个单元格共享相同的值时返回 1
保持原始插入顺序。
顺便提一下,如果有多个单元格具有相同的值(例如,超过 5 个重复的单元格),在打印表格时,某些数据可能会丢失。但是,查询表显示所有数据仍然存在,只是出于某种我不知道的原因,toString
方法没有输出一些行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。