【问题标题】:Sorting ArrayList<Object> by Comparable Interface按 Comparable 接口对 ArrayList<Object> 进行排序
【发布时间】:2013-04-17 15:02:53
【问题描述】:

实际上我想对对象的数组列表进行排序。为此,我正在使用 Comparable 接口。它完全可以工作但问题是我在排序时会出现这两个问题。

  1. 所有第一个字母大写的名字都在顶部,所有第一个字母小写的名字都在底部。

  2. 所有排序后的大写字母单词都聚集在一起,然后所有小字母单词都聚集在底部。

这是我的豆子

MyShares.java

   public class Myshares implements Comparable<Myshares> {

        int id, parent;
        String name, path, type, shared_with, shared_or_not, upload_request;

        public int getParent() {
            return parent;
        }

        public void setParent(int parent) {
            this.parent = parent;
        }

        public String getUpload_request() {
            return upload_request;
        }

        public void setUpload_request(String upload_request) {
            this.upload_request = upload_request;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPath() {
            return path;
        }

        public void setPath(String path) {
            this.path = path;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getShared_with() {
            return shared_with;
        }

        public void setShared_with(String shared_with) {
            this.shared_with = shared_with;
        }

        public String getShared_or_not() {
            return shared_or_not;
        }

        public void setShared_or_not(String shared_or_not) {
            this.shared_or_not = shared_or_not;
        }

        @Override
        public int compareTo(Myshares another) {

            return this.name.compareTo(another.getName());
        }

    }

这是输出

我认为它是基于 ASCII 码的。我想要一个完整的排序列表。请看一下。

【问题讨论】:

  • 如果你认为这是基于 ASCII 码的,你为什么不比较一下 .toUpper() 呢?

标签: java sorting arraylist comparable


【解决方案1】:

如果您希望进行不区分大小写的排序,我建议您将compareTo() 方法更改为使用StringcompareToIgnoreCase() 方法 - 即:

public int compareTo(Myshares another) {
    return this.name.compareToIgnoreCase(another.getName());
}

【讨论】:

  • @jlordo:可能是因为错字(compareToIgnoringCase() 而不是compareToIgnoreCase())。这是一个艰难的观众!
  • 我一看到就修好了 ;)
  • @nullPainter 谢谢先生,您的解决方案对我有用。为您的回答 +1。
【解决方案2】:

我为您提供了我编写的现有比较器的一些来源,该比较器执行完整的字母数字排序,并且可以处理名称中的数字,例如 10、1 等

要使用它,你可以这样做:Collections.sort(myList,comparator);

另一种方法是在您的比较方法中将两边都小写。但只要你有数字或符号,它就会被丢弃,所以我会亲自使用比较器。

使用源代码检查 GIST:https://gist.github.com/gondor/9328de5fa0cce130bc3b

【讨论】:

  • 你不觉得它很长吗。
  • 根据您的需要,如果您使用 1name、2name、10name 或任何其他符号点击字符串,您会发现它会按 1name、10name 等进行排序。这个比较器考虑了所有这些,并且很完美。甚至可以正确排序 IP 地址或主机名。
  • 仅链接的答案在此站点上不太好。如果链接过时,答案将毫无用处。您应该始终复制答案的相关部分,并且仍然可以链接到源代码。
  • 智能处理数字分量的比较器在许多应用程序中很遗憾地缺乏,所以至少为此 +1!
【解决方案3】:

将 compareTo 方法替换为:

public int compareTo(Myshares another) {
  return this.name.compareToIgnoreCase(another.getName());
}

【讨论】:

    【解决方案4】:

    你应该调整你的compareTo() 方法

    return this.name.toLowerCase().compareTo(another.getName().toLowerCase());
    

    【讨论】:

    • 我必须承认 nullPainter 提出的 compareToIgnoreCase 将是更好的解决方案,因为我的不是 null 安全的
    【解决方案5】:

    改变

    @Override
    public int compareTo(Myshares another) {
        return this.name.compareTo(another.getName());
    }
    

    @Override
    public int compareTo(Myshares another) {
        return String.CASE_INSENSITIVE_ORDER.compare(this.name, another.getName());
    }
    

    或使用nullPainter 发布的更具可读性且非常好的解决方案。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2015-11-16
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      相关资源
      最近更新 更多