【问题标题】:Sorting arraylist with numbers in ascending form以升序形式对带有数字的arraylist进行排序
【发布时间】:2014-03-14 14:00:42
【问题描述】:
al.add("1 Romeo and Juliet");
al.add("2 Juliet");
al.add("3 Romeo");
al.add("4 Mercutio");
al.add("5 Tybalt");
al.add("6 Nurse");
al.add("7 Robert Smith");
al.add("8 The Cure");
al.add("9 Suede");
al.add("10 Neil Codling");

我想在该数组列表上添加 al.add("11 Brett Anderson"),但每次我这样做时,输出总是这样:

1 Romeo and Juliet
10 Neil Codling
11 Brett Anderson
2 Juliet
3 Romeo
4 Mercutio
5 Tybalt")
6 Nurse
7 Robert Smith
8 The Cure
9 Suede

我想要发生的是数字应该按顺序排列,从 1 到 11。 我应该在 Collections.sort(arrayname); 之外保留哪些代码?

【问题讨论】:

  • 为什么不使用地图或数组?
  • 使用treemap,数字为key,字符串为value...

标签: java sorting collections arraylist


【解决方案1】:

你可以创建一个类来处理这个:

class Book {
   private int id;
   private String name;
   //other stuff
}

然后只需将新书添加到您的列表中:

al.add(new Book(1,"Romeo and Juliet"));

只需使用自定义比较器对其进行排序:

Collections.sort(al, new Comparator<Book>(){
        @Override
        public int compare(Book b1, Book b2) {
            return Integer.compare(b1.getId(), b2.getId());  
        }
};


另一种方法是使用TreeMap&lt;Integer, String&gt;,其中每个 id 都映射到一个书名。

如果您真的想继续当前的方法(我不推荐),您可以通过空格 split 您的 String 并获取 split 返回的数组中的第一个元素(假设您的String 的格式始终为(数字whateverIsAfter)。

Collections.sort(al, new Comparator<String>(){
    @Override
    public int compare(String b1, String b2) {
         String s1 = b1.split("\\s+")[0];
         String s2 = b2.split("\\s+")[0];
         return Integer.valueOf(s1).compareTo(Integer.valueOf(s2)); 
    }
});

【讨论】:

    【解决方案2】:

    Collections.sort 与适当的Comparator 一起使用

    类似:

    Collections.sort(ar, new Comparator<String>() {
    
            @Override
            public int compare(String o1, String o2) {
                // TODO Auto-generated method stub
                return o1.compareTo(o2);
            }
        });
    

    【讨论】:

      【解决方案3】:

      你能用TreeSet 代替ArrayList 吗? TreeSet 的结构会自动对您放入的任何内容进行排序。此外,创建一个单独获取数字和名称的类,然后将它们添加到您的列表中。不要忘记实现ComparableComparator

      【讨论】:

        【解决方案4】:

        您的问题是您现在是按字母顺序排序,而不是按数字排序,所以“11...”确实在“2”之前……”。您需要解析直到第一个空格字符,将该内容提取为一个数字,然后按此排序。这当然应该检查“第一个空格之前的内容”一个数字。

        所有这些听起来可能很棘手,但通过编写一个新的 'TitleNumberComparator' 应该不会太糟糕。

        了解比较器和可比性:http://javarevisited.blogspot.co.uk/2011/06/comparator-and-comparable-in-java.html

        【讨论】:

          【解决方案5】:

          您可以使用 Comparator 作为参数传递给 Collections.sort(arrayname, compartor instance) 根据您的条件对 ArrayList 进行排序。

          【讨论】:

            【解决方案6】:

            您可以使用 Map 和 keep 作为键号和标题作为值

            http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

            【讨论】:

              【解决方案7】:

              使用java.util.TreeMap,数字作为键,字符串作为值。它将按数字“自然”顺序排序。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-11-16
                • 2011-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-12-07
                相关资源
                最近更新 更多