我有四个信息(a,b,c,d)组合在一起(例如数据库表中的列)。
a和b的组合是唯一的(例如数据库表中的主键)
class MyClass {
private String a, b, c, d; //getters & setters omitted
}
class Key {
private String a, b; //getters & setters & equals & hashcode omitted
public int compareTo(Object obj) {
Key key2 = (Key) obj;
if (!this.a.equals(key2.a))
return this.a.compareTo(key2.a);
else
return this.b.compareTo(key2.b);
}
}
class Main {
private Map<Key, MyClass> map = new TreeMap();
void populateMap() {
for each item in the source {
map.put new Key(a, b), new MyClass(a, b, c, d);
}
}
}
当我遍历此地图时,行首先按字段a排序,然后按b排序。 但是我想按a-> c-> b来订购。
我可以将c添加到我的Key类中,并相应地修改compareTo函数。但这感觉不对。密钥是标识符。并且不需要c来标识行。
我应该如何修改此代码,以便(a,b)是标识符(等于&哈希码的基础)。但是我的地图按a-> c-> b的顺序存储信息吗?
答案 0 :(得分:0)
在Java中对某些内容进行排序时,基本上需要做两件事:
通过这两件事,您可以做任何您想做的事情:
public class MyClass implements Comparable<MyClass> {
@Ovveride
public int compare(MyClass other) {
if(this.a.compareTo(other.getA()) != 0)
return this.a.compareTo(other.getA());
if(this.c.compareTo(other.getC()) != 0)
return this.c.compareTo(other.getC());
return return this.b.compareTo(other.getB());
}
}
在主要班级
// you can sort only Collections so let's say you want to sort values
Collections.sort(mapValues, new Comparator<MyClass> () {
@Ovveride
public int compareTo(MyClass c1, MyClass c2) {
return c1.compare(c2);
}
});
正如我所说,您只能按键(如果键是Comparable)自然地对Collection和TreeMap进行排序,因此请考虑将信息存储在List / Set或put中,然后像我之前写的那样检索您的值。如果要订购看跌期权,则需要传递每个元素(a,b,c),但请记住,在每个看跌期权之后进行排序不是一个好习惯。
答案 1 :(得分:0)
如果要对地图的条目(Map.Entry<Key, MyClass>
)进行排序,则可以使用compairingByValue
map.entrySet().stream().sorted(comparingByValue());
并在compareTo
中实现一个MyClass
方法,该方法以所需的顺序a-> c-> b进行排序。