Java 8 具有列表的可比类<;字符串>;领域
我有一个简单的类,它存储一个整数和一个字符串列表 因为我想在Java 8 具有列表的可比类<;字符串>;领域,java-8,comparable,Java 8,Comparable,我有一个简单的类,它存储一个整数和一个字符串列表 因为我想在树集中使用这个类,所以这个类必须是可比的。 但是当尝试使用Java8Comparator类时,我无法比较我的内部列表。 我有以下错误: 方法引用中的返回类型错误:无法将java.util.List转换为U 我认为有一个非常简单的方法可以做到这一点,但我找不到它 怎么做 public class MyClass implements Comparable<MyClass> { private final int
树集
中使用这个类,所以这个类必须是可比的
。
但是当尝试使用Java8Comparator
类时,我无法比较我的内部列表。
我有以下错误:
方法引用中的返回类型错误:无法将java.util.List转换为U
我认为有一个非常简单的方法可以做到这一点,但我找不到它
怎么做
public class MyClass implements Comparable<MyClass> {
private final int someInt;
private final List<String> someStrings;
public MyClass (List<String> someStrings, int someInt) {
this.someInt = someInt;
this.someStrings = new ArrayList<>(someStrings);
}
@Override
public int compareTo(MyClass other) {
return
Comparator.comparing(MyClass::getSomeInt)
.thenComparing(MyClass::getSomeStrings) // Error here
.compare(this, other);
}
public int getSomeInt() {
return someInt;
}
public List<String> getSomeStrings() {
return someStrings;
}
}
例如,要根据长度对字符串集合进行排序,然后进行不区分大小写的自然排序,可以使用以下代码组合比较器:
Comparator cmp=Comparator.comparingInt(字符串::长度)
.Then比较(字符串.不区分大小写\u顺序);
这似乎是一个线索,但我不知道如何将其应用到这个简单的例子中
编辑2
假设我希望我的列表
按以下方式排序:
- 首先检查:
(短的小于大的)李>List.size()
- 第二步检查大小是否匹配:逐个比较两个列表中的每个元素,直到找到
方法返回1或-1字符串所在的元素。compareTo
compareTo
方法中使用lambdas实现这一点?
编辑3
这不会重复,因为我想知道如何使用Java 8链接
compariable
调用为包含列表的类构建一个比较器。所以要比较列表,首先检查长度,然后逐个比较两个列表中具有相同索引的每个项,对吗
(即[a,b,c]<[b,a,c]
)
为列表字符串的列表返回联接创建自定义比较器:
Comparator<List<String>> listComparator = (l1, l2) -> {
if (l1.size() != l2.size()) {
return l1.size() - l2.size();
}
for (int i = 0; i < l1.size(); i++) {
int strCmp = l1.get(i).compareTo(l2.get(i));
if (strCmp != 0) {
return strCmp;
}
}
return 0; // Two list equals
};
如果您希望[a,b,c]=[b,a,c]
,则必须先对这些列表进行排序,然后再进行比较:
public String getSomeStringsJoined() {
return getSomeStrings().stream().sort(Comparator.naturalOrder()).collect(Collectors.joining());
}
如何比较GetSomeString()返回的两个列表
<代码>列表
没有实现可比较的尝试然后比较(a->a.getSomeStrings().containsAll(other.getSomeStrings())
@HadiJ这取决于OP对这些列表的可比性的想法。。。我想这也可以通过.thenComparing(x->x.GetSomeString().stream().Sorded().collect(Collectors.joining())
)来完成,但除非OP告诉我们应该如何进行比较,否则这确实是一个错误unclear@Eugene,为什么要使用流
?我认为这是冗长的。我们知道您想使用String.compareTo
比较您的String
s列表;问题是,假设您要比较[a,b,c]
和[d,b,a,c]
,我只能假设第一个比第二个小(因为它的元素更少)。但是如果你有[a,b,c]
和[c,b,a]
它们是相等的,因为它们有相同的内容吗?这些不同是因为a
在c
之前吗?这就是你需要定义的,只有当字符串长度相同时,连接字符串才有效。这在[ab,c]>[a,c]上失败。我认为,顺序应该是a,aa,aaa,b,bb,bbb,c,cc,ccc
,换句话说,如果一个字符串是另一个字符串的前缀,那么长度应该只在末尾进行比较。@MạnhQuyế特恩盖伊ễ谢谢,这就是我想要的:使用链接Comparator
方法,使我的类具有可比性。由于我可以内联比较器
声明,这应该可以解决我的问题。
Comparator<List<String>> listComparator = (l1, l2) -> {
if (l1.size() != l2.size()) {
return l1.size() - l2.size();
}
for (int i = 0; i < l1.size(); i++) {
int strCmp = l1.get(i).compareTo(l2.get(i));
if (strCmp != 0) {
return strCmp;
}
}
return 0; // Two list equals
};
@Override
public int compareTo(MyClass other) {
return Comparator.comparing(MyClass::getSomeInt)
.thenComparing(Comparator.comparing(MyClass:: getSomeStrings , listComparator))
.compare(this, other);
}
public String getSomeStringsJoined() {
return getSomeStrings().stream().sort(Comparator.naturalOrder()).collect(Collectors.joining());
}