如何编写自定义比较器以使用 SimpleEntry 对 Treeset 进行排序?
How to code a custom Comparator to sort a Treeset with SimpleEntry?
我目前正在做一项作业,它要求我使用 Treeset 对值对进行排序。我被要求使用 SimpleEntry。我将它们存储在 Treeset 中:
TreeSet treeSet = new TreeSet(new PairComparator());
SimpleEntry pair = new SimpleEntry(weight,source);
treeSet.add(pair);
这是我的自定义比较器:
static class PairComparator implements Comparator<AbstractMap.SimpleEntry<Integer, Integer>> {
@Override
public int compare(AbstractMap.SimpleEntry<Integer,Integer> o1, AbstractMap.SimpleEntry<Integer,Integer> o2) {
int key1 = o1.getKey() ;
int key2 = o2.getKey();
return key1 - key2;
}
}
我收到一个我不明白的错误,它是:
class java.util.HashMap cannot be cast to class java.lang.Integer
你能解释一下发生了什么吗?我对定义自定义比较器不是很熟悉。
感谢您的关注!
编辑: 我在我的 SimpleEntry 上添加了一个 Hashmap 作为键,而不是一个整数,现在很明显...
似乎您以某种方式添加了一个 HashMap 作为 TreeSet 中的一个 SimpleEntries 的键。
请显示完整的可运行示例。
这段代码对我有用:
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
import java.util.Comparator;
import java.util.TreeSet;
public class Main {
static class PairComparator implements Comparator<SimpleEntry<Integer, Integer>> {
@Override
public int compare(SimpleEntry<Integer, Integer> o1, SimpleEntry<Integer, Integer> o2) {
int key1 = o1.getKey();
int key2 = o2.getKey();
return key1 - key2;
}
}
public static void main(String[] args) {
TreeSet treeSet = new TreeSet(new PairComparator());
treeSet.add(new SimpleEntry(42, 69));
treeSet.add(new SimpleEntry(37, 65));
treeSet.add(new SimpleEntry(23, 19));
treeSet.add(new SimpleEntry(54, 12));
System.out.println(treeSet);
}
}
您没有指定 TreeSet
和其他一些数据结构的类型,但我在这里指定了它并且工作正常。我确实改变了你的比较器。减去整数值进行比较不是一个好主意,因为它可能会导致大量问题。
TreeSet<SimpleEntry<Integer, Integer>> treeSet =
new TreeSet<>(new PairComparator());
Random r = new Random(23);
for (int i = 0; i < 10; i++) {
int weight = r.nextInt(100);
int source = r.nextInt(100);
SimpleEntry<Integer, Integer> pair =
new SimpleEntry<>(weight, source);
treeSet.add(pair);
}
treeSet.forEach(System.out::println);
打印以下内容(忽略重复键)
18=43
22=17
24=30
27=48
81=95
83=47
89=70
90=10
94=87
比较器
static class PairComparator implements
Comparator<AbstractMap.SimpleEntry<Integer, Integer>> {
public int compare(
AbstractMap.SimpleEntry<Integer, Integer> o1,
AbstractMap.SimpleEntry<Integer, Integer> o2) {
int key1 = o1.getKey();
int key2 = o2.getKey();
return key1 < key2 ? -1 : key1 > key2 ? 1 : 0;
}
}
您还可以将以下内容指定为比较器。
Comparator<AbstractMap.SimpleEntry<Integer,Integer>> pairComparator =
(se1,se2)-> Integer.compare(se1.getKey(),se2.getKey());
我目前正在做一项作业,它要求我使用 Treeset 对值对进行排序。我被要求使用 SimpleEntry。我将它们存储在 Treeset 中:
TreeSet treeSet = new TreeSet(new PairComparator());
SimpleEntry pair = new SimpleEntry(weight,source);
treeSet.add(pair);
这是我的自定义比较器:
static class PairComparator implements Comparator<AbstractMap.SimpleEntry<Integer, Integer>> {
@Override
public int compare(AbstractMap.SimpleEntry<Integer,Integer> o1, AbstractMap.SimpleEntry<Integer,Integer> o2) {
int key1 = o1.getKey() ;
int key2 = o2.getKey();
return key1 - key2;
}
}
我收到一个我不明白的错误,它是:
class java.util.HashMap cannot be cast to class java.lang.Integer
你能解释一下发生了什么吗?我对定义自定义比较器不是很熟悉。
感谢您的关注!
编辑: 我在我的 SimpleEntry 上添加了一个 Hashmap 作为键,而不是一个整数,现在很明显...
似乎您以某种方式添加了一个 HashMap 作为 TreeSet 中的一个 SimpleEntries 的键。
请显示完整的可运行示例。
这段代码对我有用:
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
import java.util.Comparator;
import java.util.TreeSet;
public class Main {
static class PairComparator implements Comparator<SimpleEntry<Integer, Integer>> {
@Override
public int compare(SimpleEntry<Integer, Integer> o1, SimpleEntry<Integer, Integer> o2) {
int key1 = o1.getKey();
int key2 = o2.getKey();
return key1 - key2;
}
}
public static void main(String[] args) {
TreeSet treeSet = new TreeSet(new PairComparator());
treeSet.add(new SimpleEntry(42, 69));
treeSet.add(new SimpleEntry(37, 65));
treeSet.add(new SimpleEntry(23, 19));
treeSet.add(new SimpleEntry(54, 12));
System.out.println(treeSet);
}
}
您没有指定 TreeSet
和其他一些数据结构的类型,但我在这里指定了它并且工作正常。我确实改变了你的比较器。减去整数值进行比较不是一个好主意,因为它可能会导致大量问题。
TreeSet<SimpleEntry<Integer, Integer>> treeSet =
new TreeSet<>(new PairComparator());
Random r = new Random(23);
for (int i = 0; i < 10; i++) {
int weight = r.nextInt(100);
int source = r.nextInt(100);
SimpleEntry<Integer, Integer> pair =
new SimpleEntry<>(weight, source);
treeSet.add(pair);
}
treeSet.forEach(System.out::println);
打印以下内容(忽略重复键)
18=43
22=17
24=30
27=48
81=95
83=47
89=70
90=10
94=87
比较器
static class PairComparator implements
Comparator<AbstractMap.SimpleEntry<Integer, Integer>> {
public int compare(
AbstractMap.SimpleEntry<Integer, Integer> o1,
AbstractMap.SimpleEntry<Integer, Integer> o2) {
int key1 = o1.getKey();
int key2 = o2.getKey();
return key1 < key2 ? -1 : key1 > key2 ? 1 : 0;
}
}
您还可以将以下内容指定为比较器。
Comparator<AbstractMap.SimpleEntry<Integer,Integer>> pairComparator =
(se1,se2)-> Integer.compare(se1.getKey(),se2.getKey());