标签: comparator

Java错误:比较方法违反了其一般合同

我看到很多关于这个的问题,并试图解决这个问题,但经过一个小时的谷歌搜索和大量的试验和错误,我仍然无法解决它.我希望你们中的一些人能够解决问题.

这就是我得到的:

java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:835)
    at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:453)
    at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:392)
    at java.util.ComparableTimSort.sort(ComparableTimSort.java:191)
    at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
    at java.util.Arrays.sort(Arrays.java:472)
    at java.util.Collections.sort(Collections.java:155)
    ...
Run Code Online (Sandbox Code Playgroud)

这是我的比较器:

@Override
public int compareTo(Object o) {
    if(this == o){
        return 0;
    }

    CollectionItem item = (CollectionItem) o;

    Card card1 = CardCache.getInstance().getCard(cardId);
    Card card2 = CardCache.getInstance().getCard(item.getCardId());

    if (card1.getSet() < card2.getSet()) {
        return -1;
    } else {
        if (card1.getSet() == card2.getSet()) {
            if (card1.getRarity() < card2.getRarity()) {
                return 1;
            } else {
                if (card1.getId() == card2.getId()) { …
Run Code Online (Sandbox Code Playgroud)

java migration compare comparator java-7

68
推荐指数
4
解决办法
11万
查看次数

null-safe mapping使用默认实现的Comparator

是否有内置的可能性在Java 8中创建一个空安全的映射比较器而无需编写自己的实现Comparator

运行以下代码时,它会导致NPE,因为keyExtractor参数Comparator.comparing()可能返回一个null值:

public class ToSort
{

    private String sortBy;

    public ToSort(String sortBy)
    {
        this.sortBy = sortBy;
    }

    public String getSortBy()
    {
        return sortBy;
    }

    public static void main(String[] args)
    {
        // mapping comparator
        Comparator<ToSort> comp = Comparator.comparing(ToSort::getSortBy);                          
        SortedSet<ToSort> set = new TreeSet<>(comp);
        ToSort o1 = new ToSort("1");
        ToSort o2 = new ToSort(null);

        set.add(o1);

        System.out.println(set.contains(o2)); //NPE because o2.getSortBy() == null

    }
}
Run Code Online (Sandbox Code Playgroud)

java.util.Comparator.lambda中线程"main"java.lang.NullPointerException中的异常$比较java.util.Comparator上的$ 77a9974f $ 1(Comparator.java:469)$$ Lambda $ 2/1480010240.compare(未知来源)at java.util.Comparators $ NullComparator.compare(Comparators.java:83),java.util.TreeMap.getEntryUsingComparator(TreeMap.java:376),位于java.util的java.util.TreeMap.getEntry(TreeMap.java:345) …

java comparator java-8

62
推荐指数
1
解决办法
1万
查看次数

具有空值的比较器

我们有一些代码,它们根据坐标之间的距离对地址列表进行排序.这是通过collections.sort与自定义比较器完成的.

但是,有时会在列表中出现没有坐标的地址,从而导致出现NullPointerException.我最初的想法是让比较器返回0作为地址的距离,其中至少有一个坐标为空.我担心这可能会导致列表中"有效"元素的订单损坏.

所以在比较器ok中返回空数据的'0'值,或者有更清晰的方法来解决这个问题.

java comparator

55
推荐指数
5
解决办法
5万
查看次数

标准API中是否存在自然比较器?

我需要一个比较器作为策略模式的一部分,可以使用对象的自然顺序或一些自定义顺序.对于自然排序的情况,我写了一个简单的比较器:

private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> {
    @Override
    public int compare(T o1, T o2) {
        return o1.compareTo(o2);
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来很简单,但我想知道是否有人知道标准API中的一个.我查看了TreeMap,它没有这样的类,所以当编写代码时,明显的答案是否定的,但也许稍后会添加.

java comparable comparator

54
推荐指数
3
解决办法
3万
查看次数

当捕获实际上没有捕获任何东西

由于最近存储在数据库中的数据不好,导致程序崩溃.这让我感到困惑,因为我觉得我有一个阻止这一点.

以下代码的目的是比较员工徽章编号并对其进行排序.如果出现错误,请返回-1并且士兵开启 - 请勿停止,因为数千个徽章编号中的一个错误:

public int compare(Employee t, Employee t1) {
    Integer returnValue = -1;
    try {
        Integer tb = Integer.parseInt(t.getBadgeNumber());
        Integer t1b = Integer.parseInt(t1.getBadgeNumber());
        returnValue = tb.compareTo(t1b);
    } catch (Exception e) {
        returnValue = -1;//useless statement, I know.
    }
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

当坏徽章编号被击中时(在这种情况下为t),我得到了一个"java.lang.IllegalArgumentException:比较方法违反了它的一般合同!" 错误而不是在catch中返回-1.

关于这里的捕获,我不明白什么?

完整的堆栈跟踪:

16-May-2018 14:28:53.496 SEVERE [http-nio-8084-exec-601] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [RequestServlet] in context with path [/AppearanceRequest] threw exception
 java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeForceCollapse(TimSort.java:426)
at java.util.TimSort.sort(TimSort.java:223)
at java.util.TimSort.sort(TimSort.java:173) …
Run Code Online (Sandbox Code Playgroud)

java exception try-catch comparator

54
推荐指数
2
解决办法
1万
查看次数

使用多个键对Java对象进行排序

我有一个Duck对象的集合,我想用多个键对它们进行排序.

class Duck {
    DuckAge age; //implements Comparable
    DuckWeight weight; //implements Comparable
    String name;
}
List<Duck> ducks = Pond.getDucks();
Run Code Online (Sandbox Code Playgroud)

例如.我想主要根据他们的重量来排序,其次是他们的年龄.如果两只鸭子具有完全相同的重量和完全相同的年龄,那么让我们使用它们的名称作为三级键来区分它们.我可能会这样做:

Collections.sort(ducks, new Comparator<Duck>(){
    @Override
    public int compare(Duck d1, Duck d2){
        int weightCmp = d1.weight.compareTo(d2.weight);
        if (weightCmp != 0) {
            return weightCmp;
        }
        int ageCmp = d1.age.compareTo(d2.age);
        if (ageCmp != 0) {
            return ageCmp;
        }
        return d1.name.compareTo(d2.name);
    }
});
Run Code Online (Sandbox Code Playgroud)

我经常这样做,但这个解决方案闻不到.它不能很好地扩展,并且很容易搞砸.当然必须有一种更好的方法来使用多个键对Ducks进行排序!有人知道更好的解决方案吗?

EDIT删除了不必要的else分支

java sorting comparable comparator

50
推荐指数
5
解决办法
1万
查看次数

在Java 8中反转比较器

我有一个ArrayList,并希望按降序排序.我用它来做法java.util.stream.Stream.sorted(Comparator).这是根据Java API的描述:

返回由此流的元素组成的流,并根据提供的内容进行排序Comparator.

这个方法给我一个升序排序.我应该更改哪个参数,只是为了降序?

java sorting comparator java-8 java-stream

44
推荐指数
4
解决办法
7万
查看次数

Java 8 Lambda:比较器

我想用Lambda对列表进行排序:

List<Message> messagesByDeviceType = new ArrayList<Message>();      
messagesByDeviceType.sort((Message o1, Message o2)->o1.getTime()-o2.getTime());
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个编译错误:

 Multiple markers at this line
    - Type mismatch: cannot convert from long to int
    - The method sort(Comparator<? super Message>) in the type List<Message> is not applicable for the arguments ((Message o1, Message o2) 
     -> {})
Run Code Online (Sandbox Code Playgroud)

java lambda comparator java-8

43
推荐指数
4
解决办法
3万
查看次数

SQL中"LIKE"和"="之间有什么区别?

之间有什么区别:

SELECT * FROM users WHERE username="davyjones"
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM users WHERE username LIKE "davyjones"
Run Code Online (Sandbox Code Playgroud)

(我想我已经搞砸了语法......原谅我,
我主要是桌面应用程序开发人员)

sql syntax comparator

42
推荐指数
4
解决办法
5万
查看次数

以(区分大小写)字母顺序对字符串进行排序的简单方法

我需要按字母顺序对字符串列表进行排序:

List<String> list = new ArrayList();
list.add("development");
list.add("Development");
list.add("aa");
list.add("AA");
list.add("Aa");
Run Code Online (Sandbox Code Playgroud)

一种常见的方法是使用比较器:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)

CaseInsensitiveComparator的问题是"AA"等于"aa".字符串根据相同值的添加顺序出现在结果中,并且不正确:

"aa","AA","Aa","development","Development"
Run Code Online (Sandbox Code Playgroud)

java string alphabetical comparator

41
推荐指数
2
解决办法
12万
查看次数