【问题标题】:Sort set in java using Comparator [closed]使用比较器在java中设置排序[关闭]
【发布时间】:2014-07-29 12:31:50
【问题描述】:

我正在尝试使用Comparator 对集合进行排序,如下所示。

Set seatSet = tc.getTheatreSeat();
    List listArr = new ArrayList(seatSet);
    Collections.sort(listArr, new Comparator() {
        public int compare(Object arg0, Object arg1) {
            TheatreSeat r1 = (TheatreSeat) arg0;
            TheatreSeat r2 = (TheatreSeat) arg1;
            if (r2.getId() < r1.getId()) {
                return 1;
            }
            return 0;
        }
    });

但它不起作用。我的代码有什么问题请帮忙。

【问题讨论】:

  • 1) 缩进你的代码。 2)“它不工作”不是一个好的描述。 3) 我们不知道您使用的是哪种套装 - 大多数都不允许显式排序。 4) 请编写一个简短但完整的程序来演示问题。
  • 在什么情况下它不起作用?我看到您已将Set 的内容复制到List 并尝试对List 进行排序,那您为什么将您的帖子称为Sort set
  • set 包含类 TheatreSeat 的对象,其值 id 为 rownumber 等。我想用 id 对其进行排序。我该怎么做>对不起我在这里发布问题的错误尝试

标签: java set comparator


【解决方案1】:

比较函数的返回值应该是 -1、0 或 +1,而不仅仅是 1 或 0。

return Integer.compare(r1.getId(), r2.getId());

代替 if 语句应该可以完成这项工作。

使用 lambda 的 Java 8 排序将是

listArr.sort(Comparator.comparing(e -> e.getId()));

【讨论】:

    【解决方案2】:

    它看起来很正确,应该可以正常工作。

    为了理解比较器的 int 返回值,定义了 3 个结果:

    1. 小于 0(负值)表示第一个元素在第二个之后
    2. 零表示它们相等
    3. 大于 0(正值)表示第一个元素在第二个之前

    通过将正负反转,反之亦然,您可以定义升序和降序。

    这里是比较器的完整版本(我将 ID 放在变量中以使其更易于阅读):

    new Comparator() {
      public int compare(Object val1, Object val2) {
        int id1 = ((TheatreSeat) val1).getId();
        int id2 = ((TheatreSeat) val2).getId();
        return id1 - id2;
      }
    }
    

    那么我为什么要写 id1 - id2 呢?因为它的结果正是我们想要的。如果 id2 大于 id1 结果将小于零,反之亦然,当 id1 和 id2 相等时,结果将为零;)

    在排序之前和之后使用步进调试器检查您的列表以检查结果。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2013-12-12
    • 2020-10-08
    • 1970-01-01
    • 2018-09-20
    • 2014-10-21
    相关资源
    最近更新 更多