代码之家  ›  专栏  ›  技术社区  ›  Henry

为不可比较列表实现自然顺序比较器

  •  0
  • Henry  · 技术社区  · 4 年前

    我正在实施 List 用于克隆的接口 ArrayList .我正在努力实现 sort ( source ): java.util.List sort method 我不确定如何实现比较器为空的情况。我的 ArrayList 不延伸 Comparable 因为我希望能够在列表中存储不可比较的对象。我试着用下面的方法 分类 方法:

    public void sort(Comparator<? super E> c){
        if(c == null){
            // Use ascending order
            class ascComparator<T extends Comparable<? super T>> implements Comparator<T> {
                public int compare(T a, T b) {
                    return a.compareTo(b);
                }
            }
            c = new ascComparator<E>();
        }
        // Implementation of merge sort goes here
    }
    

    这可能会产生一个错误 E 不延伸 可比较的 .在上述文件中规定,“如果……为空,则该列表中的所有元素必须实现可比接口”。如何检查列表中的对象是否实现 可比较的 那么我该如何使用 compareTo 没有出错?有更好的方法吗?

    2 回复  |  直到 4 年前
        1
  •  1
  •   tgdavies    4 年前

    看什么 ArrayList 如果有,请尝试:

    import java.util.ArrayList;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) {
            List<Object> objects = new ArrayList<>();
            objects.add(new Object());
            objects.add(new Object());
    
            objects.sort(null);
        }
    }
    

    比较器必须假设列表中的对象是可比较的,这是它所能做的最好的:

     class ascComparator implements Comparator<Object> {
                public int compare(Object a, Object b) {
                    return ((Comparable)a).compareTo(b);
                }
            }
    

    这将抛出一个 ClasscastException 如果列表中的项目不是 Comparable .

        2
  •  0
  •   Louis Wasserman    4 年前

    你只需要做不安全的演员。真的没办法。

    推荐文章