如何在 Kotlin 或 Java 中对排序列表进行设置操作?
How to do set operations on sorted lists in Kotlin or Java?
我有两个唯一项目的排序列表,我想找到它们的集合差异并以快速且缓存友好的方式设置交集,例如使用 C++ std::set_difference and std::set_intersection。
但是,现在我在Kotlin工作,找不到相应的功能。由于 Kotlin 标准库是在 Java 标准库之上构建的,因此欢迎 Java 回答。
我通读了 this and this 很好的问题和所有答案,但据我所知,它们只处理任意集合,因此无法排序。
Guava也是如此。
这里是在最坏情况下运行 O(n+m) 的合并交叉实现
static <T extends Comparable<T>> List<T> intersect(List<T> list1, List<T> list2) {
final int size1 = list1.size();
final int size2 = list2.size();
final List<T> result = new ArrayList<>(Math.min(size1, size2));
int i = 0;
int j = 0;
while (i < size1 && j < size2) {
T a = list1.get(i);
int compare = a.compareTo(list2.get(j));
if (compare < 0)
i++;
else if (compare > 0)
j++;
else {
result.add(a);
i++;
j++;
}
}
return result;
}
我有两个唯一项目的排序列表,我想找到它们的集合差异并以快速且缓存友好的方式设置交集,例如使用 C++ std::set_difference and std::set_intersection。
但是,现在我在Kotlin工作,找不到相应的功能。由于 Kotlin 标准库是在 Java 标准库之上构建的,因此欢迎 Java 回答。
我通读了 this and this 很好的问题和所有答案,但据我所知,它们只处理任意集合,因此无法排序。
Guava也是如此。
这里是在最坏情况下运行 O(n+m) 的合并交叉实现
static <T extends Comparable<T>> List<T> intersect(List<T> list1, List<T> list2) {
final int size1 = list1.size();
final int size2 = list2.size();
final List<T> result = new ArrayList<>(Math.min(size1, size2));
int i = 0;
int j = 0;
while (i < size1 && j < size2) {
T a = list1.get(i);
int compare = a.compareTo(list2.get(j));
if (compare < 0)
i++;
else if (compare > 0)
j++;
else {
result.add(a);
i++;
j++;
}
}
return result;
}