java - CompareTo 可能返回 0,替代 TreeSet/TreeMap

标签 java sorting collections binary-tree red-black-tree

我需要一组经过排序的对象,目前正在使用 TreeSet。我的问题是对象的 compareTo 通常会返回 0,这意味着这两个对象的顺序将保持不变。 TreeMap(默认情况下由 TreeSet 使用)会将它们视为同一对象,这是不正确的。

我可以使用什么替代TreeMap


用例:我有一组可显示的对象。我想按 Y 坐标对它们进行排序,以便它们以正确的顺序呈现。当然,两个对象很可能具有相同的 Y 坐标。

最佳答案

您正在定义一个比较标准,但您需要添加额外的标准。

你说:

I have a set of displayable objects. I want to sort them by Y coordinate, so that they are rendered in the correct order. Of course, two objects may well have the same Y coordinate.

那么,如果两个元素有相同的 Y 坐标,你应该先放什么?其他标准是什么?

可能是创建时间,也可能是x坐标,你只需要定义它:

Map<String,Thing> map = new TreeMap<String,Thing>(new Comparator<Thing>(){
     public int compare( Thing one, Thing two ) {
         int result = one.y - two.y;
         if( result == 0 ) { // same y coordinate use another criteria
             result = one.x - two.x;
             if( result == 0 ) { //still the same? Try another criteria ( maybe creation time
                 return one.creationTime - two.creationTime
             }
          }
          return result;
     }
});

您必须定义一个 Thing 何时高于/低于/等于/高于其他 Thing 。如果其中一个属性与其他属性相同,您可能不应该移动它们。如果有其他属性可以比较使用它。

关于java - CompareTo 可能返回 0,替代 TreeSet/TreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3040784/

相关文章:

Java 排序集合实现,允许许多相等的值

java : Error while create object in collection API

java - 从使用 Java 流的员工列表中获取特定加入日期之前和之后的员工

java - Docker OpenJDK -Xmx 或

java - 并行测试期间测试失败后如何关闭浏览器

java - 寻找基于输入参数的类创建和配置模式

javascript - 何时告知冒泡排序已完成 JavaScript

java - 使用 Mqttclient 异步并发处理多个消息传递

Python 按频率对文件进行排序

c++ - Min-HeapSort 不在 ~350 个元素后排序