Java 8 具有列表的可比类<;字符串>;领域

Java 8 具有列表的可比类<;字符串>;领域,java-8,comparable,Java 8,Comparable,我有一个简单的类,它存储一个整数和一个字符串列表 因为我想在树集中使用这个类,所以这个类必须是可比的。 但是当尝试使用Java8Comparator类时,我无法比较我的内部列表。 我有以下错误: 方法引用中的返回类型错误:无法将java.util.List转换为U 我认为有一个非常简单的方法可以做到这一点,但我找不到它 怎么做 public class MyClass implements Comparable<MyClass> { private final int

我有一个简单的类,它存储一个整数和一个字符串列表

因为我想在
树集
中使用这个类,所以这个类必须是
可比的
。 但是当尝试使用Java8
Comparator
类时,我无法比较我的内部列表。 我有以下错误:

方法引用中的返回类型错误:无法将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()
    (短的小于大的)
  • 第二步检查大小是否匹配:逐个比较两个列表中的每个元素,直到找到
    字符串所在的元素。compareTo
    方法返回1或-1
如何在my
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());
}