将c ++代码移植到Java时遇到问题。我有一个对的列表如下
vector<pair<pair<int,int>,int> > M;
我用Java编写了等效的
List<Pair<Pair<Integer,Integer>,Integer>> pairList = new ArrayList<>();
现在在c ++代码中,M充满了值,相应地我在Java中做了同样的事情。现在,c ++有一个排序功能如下
sort(M.begin(), M.end());
这是我的问题,我需要用Java编写的等效比较器是什么? 我该如何使用它?我假设以下几行
Collections.sort(pairList, new MyComparator())
有人可以帮我理解 MyComparator 会是什么吗?
配对课程如下
class Pair<K,V>{
K k;
V v;
public void makePair(K k, V v){
this.k = k;
this.v = v;
}
}
解决方案
我最终按照以下方式对 MyComparator 进行了实施
static class MyComparator implements Comparator<Pair<Pair<Integer,Integer>,Integer>>{
@Override
public int compare(Pair<Pair<Integer,Integer>,Integer> p1,Pair<Pair<Integer,Integer>,Integer> p2){
int a = p1.k.v.compareTo(p2.k.v);
if(a==0) return a;
else return p1.k.k.compareTo(p2.k.k);
}
}
谢谢大家。
答案 0 :(得分:1)
您的Comparator应该是实现接口Comparator<T>
的类。 T是与您的集合相关联的泛型类型。
对你而言Pair<Pair<Integer,Integer>,Integer>
。
所以你应该有这样的课程:
public Class MyComparator implements Comparator<Pair<Pair<Integer,Integer>,Integer>> {
@Override
public int compare(Pair<Pair<Integer,Integer>,Integer> o1, Pair<Pair<Integer,Integer>,Integer> o2) {
// Here you should put your comparison code :
// return 0 if the 2 objects are the same
// return -1 (or another negative int) if the o2 > o1
// return 1 (or another positive int) if o2 < o1
}
}
答案 1 :(得分:0)
MyComparator
需要实现Comparator
,以便Java知道如何比较列表中的元素。它可以以Comparator
或Comparable
两种形式完成。
一个很好的例子是here。
答案 2 :(得分:0)
通过使java Pair
类的行为类似于C ++ std::pair
,可以完全避免使用比较器。 Apache Commons Lang有Pair
可以做你想要的。
但是:为什么不使用正确的自定义数据类而不是嵌套对?我已经认为C ++版本非常麻烦。
如果您不想使用它,请自行动手:
class Pair<K extends Comparable<K>,V extends Comparable<V>>
implements Comparable<Pair<K, V>>
{
// have a immutable pairs
final K k;
final V v;
Pair(final K k, final V v)
{
this.k = k;
this.v = v;
}
// factory function, the same as in C++
// (where it exists because template syntax is akward)
// (as is generics syntax)
public static <K extends Comparable<K>, V extends Comparable<V>> Pair<K, V> makePair(K k, V v)
{
return new Pair(k, v);
}
@override
public int compareTo(final Pair<K, V> other)
{
int compare = this.k.compareTo(other.k);
if (compare == 0) {
compare = this.v.compareTo(other.v);
}
return compare;
}
// NOTE: we also need equals() and hashCode() for a proper class.
}
我尝试避免编写隐式Comparator
并将其传递给sort函数,除非您需要特殊的套装排序。