地图中的自定义排序顺序,与身份无关

时间:2019-05-21 11:47:08

标签: java

我有四个信息(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的顺序存储信息吗?

2 个答案:

答案 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进行排序。