【问题标题】:Sorting of ArrayLIstArrayLIst 的排序
【发布时间】:2011-07-20 06:09:58
【问题描述】:

如何在不使用比较器的情况下在 java 中对 ArrayList 进行排序?

我已经使用了比较器,但它对我来说不能正常工作,这意味着数据不是特别的方式。

我有一个包含以下属性的数组列表...

getTotal(),
getID(),
getRank(),
getItemName(),
getFinalRank()

我已将这一切归为一个数组列表itemWiseDetails

现在我想制作 poi 报告并显示所有这些详细信息,但根据其排名 项目名称。还有一件事我的排名在字符串中,所以当我尝试根据这个排名进行排序时,它会将 N/A 数据作为 0 排名,所以它首先显示然后显示第一排名,然后显示第二然后继续..

所以,我想在没有比较器的情况下对这个 itemWiseDetails 列表进行排序

提前致谢,

我已经用这种方式实现了比较器

 public int compareTo(Object itemDetailVO) 
    {
    if (!(itemDetailVOinstanceof ItemDetailVO)) throw new ClassCastException("AItemDetailVOobject expected."); 
    int otherItemRank = Integer.parseInt(((ItemDetailVO) itemDetailVO).getRank().toString()); 
return Integer.parseInt(this.trLotRank.toString())- otherBidderRank;
    }

【问题讨论】:

  • I have already used comparator and it work not properly for me 不应该这样
  • 包含以下属性 - 我希望列表包含具有命名属性而您没有的对象将属性添加到列表或子类 ArrayList 并将属性添加到子类...
  • 没有this 工作?
  • “对我不起作用”是一个奇怪的断言。它有效或无效,无论是您还是其他人按下“运行”按钮都没有关系。我可以向你保证,java 比较器“工作”。那么,您能否发布您的比较器代码以便我们进行更正?正如其他人所说,比较器是正确的方法。
  • 您真正的问题是 1) 无法说明您的要求是什么,2) 无法对实现您的要求的 Comparator 进行编码/调试,以及 3) 显然不是了解ComparatorComparable 之间的区别。

标签: java sorting arraylist comparator


【解决方案1】:

你有两个选择:

  • 让您的类实现 Comparable,并在不指定比较器的情况下调用 Collections.sort
  • 正确实施比较器

您似乎正在采用“我尝试过 X 并且它不起作用,因此我需要尝试其他方法”的方法 - 但 X(使用比较器)不起作用的原因似乎是您的比较器有错误...它没有按照您想要的方式比较项目。实现Comparable 时会遇到完全相同的问题。您仍然需要完成相同的基本工作(研究如何比较两个项目)——这实际上只是逻辑走向何处的问题。

通常实现Comparator 是一种更灵活的方法,因为它允许根据您的需要以不同的方式对集合进行排序。它还允许您对无法更改元素类本身代码的集合进行排序。我个人会坚持Comparator 方法。

编写一些单元测试来比较各种项目,然后实现比较器以使这些测试通过。然后,如果您发现更多问题,请为该案例添加测试并让 that 也通过。迭代直到您的比较器正常工作。

【讨论】:

  • 不,不,使用排名比较器排序确实有效。但是对于我的编码结构,这是冲突的。
  • @water:你说它没有正常工作。 “与我的编码结构冲突”是什么意思?你一点都不清楚。请阅读tinyurl.com/so-hints
  • 我已经像这样使用比较器 public int compareTo(Object itemDetailVO) {if (!(itemDetailVOinstanceof ItemDetailVO)) throw new ClassCastException("A ItemDetailVOobject expected."); int otherItemRank = Integer.parseInt(((ItemDetailVO) itemDetailVO).getRank().toString()); return Integer.parseInt(this.trLotRank.toString())- otherBidderRank;
  • Comparator 是这样做的方法,但 Comparable 一开始可能更容易理解。明白了之后,无论如何都要实现同样的方法。
  • @water:那是在实现 Comparable,而不是 Comparator……这显然是不合适的,因为您的排名字符串有时可能是“N/A”,正如您所写的那样。根据我的回答,您的比较被破坏了 - 所以修复它。您需要考虑将“N/A”作为排名字符串的可能性。一般来说,您也不应该只使用减法来比较整数 - 如果您有一个非常大但为负的排名和一个非常大但为正的排名,它会中断。
【解决方案2】:

好的,让我们更正(或重写)您的比较器。

public class ItemDetailVOComparator implements Comparator<ItemDetailVO> {

  public int compare(ItemDetailVO itemDetailVO1, ItemDetailVO itemDetailVO2) {
    String rank1 = itemDetailVO1.getRank();
    String rank2 = itemDetailVO1.getRank();
    if (rank1 == null && rank2 == null) {
      return 0;
    }
    // invert 1 and -1 if nulls should appear first
    if (rank1 == null) {
      return 1;
    }
    if (rank2 == null) {
      return -1;
    }
    // nothing can be null at this point
    return rank1.compareTo(rank2);
  }    
}

这更容易阅读......而且它有效:-)

【讨论】:

  • +1 - 但是,它可能无法按照@water 的要求处理排序。不幸的是,他没有清楚地说明要求是什么,所以我们只能猜测“等级”值可能是什么以及它们应该如何排序。 (是的,我们知道它们是字符串,但这还不够。)
  • 好吧,如果它是字符串中的数字,只需将最后一行更改为: return Integer.parseInt(rank1).compareTo(Integer.parseInt(rank2)) ;但是,我建议将“等级”更改为整数。
【解决方案3】:

回答第一个问题:

java.util.Collections.sort(itemWiseDetails);

解决您的问题:编写一个正确的比较器。您可能没有required properties 之一,因此产生了不一致的结果。如果您需要帮助,请随时在此问题或其他问题中发布您的(简短!)数据结构、排序愿望和当前比较器。

【讨论】:

  • 谢谢,但我已经尝试过了,但它对我来说不能正常工作,顺便说一句,这不是完全实现
  • @water “它不起作用”不是放弃比较器的正当理由
【解决方案4】:

您可以尝试使用比较器:

public static List sort(List list) {
      Collections.sort(list, new Comparator() {

        public int compare(Object o1, Object o2) {
             String s1 = (String)o1;
             String s2 = (String)o2;

             String integer1[] = s1.split("[^0-9]");      // <<<<<  changed
             String integer2[] = s2.split("[^0-9]");      // <<<<<  changed
             String chars1[] = s1.split("[0-9]+");         // <<<<<  changed
             String chars2[] = s2.split("[0-9]+");         // <<<<<  changed

             Integer i1 = new Integer( Integer.parseInt(integer1[0]) );
             Integer i2 = new Integer( Integer.parseInt(integer2[0]) );

             if (i1.equals(i2))
                return chars1[1].compareTo(chars2[1]);
              else
                 return i1.compareTo(i2);
        }
    });
    return list;
}

输入:

字符串 i[] = { "115", "1125", "147", “37”、“57”、“37”};

输出:

37 37 57 115 147 1125

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 2011-07-15
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多