【问题标题】:Java sort numbers in arraylistJava对arraylist中的数字进行排序
【发布时间】:2011-12-31 22:12:40
【问题描述】:

我已经创建了一个这样的数组列表

ArrayList<String> entries = new ArrayList<String>();
entries.add("0 - name1");
entries.add("1000 - name2");
entries.add("1004 - name4");
entries.add("1002 - name3");
entries.add("10000 - name5");
entries.add("2000 - name5");

列表总是以 0 到 15,000 之间的数字开始,所以当我排序时,我希望它只根据数字进行排序,没有一个数字会匹配,它们应该按升序排列。

如何使用 java 来完成,我可以使用比较器吗?

【问题讨论】:

    标签: java string sorting comparator


    【解决方案1】:

    是的,可以使用 Comparator 完成,但效率不高,因为您需要不断解析数据以提取数字,然后您需要将数字转换为 Integer 并进行比较.

    更好的方法是创建一个具有两个属性的自定义对象,数字和名称。然后你可以按数字排序。比较器将是直截了当的。您可以在论坛中搜索示例。

    【讨论】:

    • 是的,它是更好的选择,但是知道如何编写可以处理以这种方式给出的“数字”的比较器是非常需要的知识:)
    【解决方案2】:

    我可以使用比较器吗?

    是的,你可以:)

    使用语法:Collections.sort(entries,comparator); - 您需要导入 java.util.Collections 并编写比较器来满足您的需求。你不妨试试.sort(entries) 使用默认比较器(但在这里它不起作用:))。

    这里是完整的解决方案:

    import java.util.Comparator;
    
    public class MyComparator implements Comparator<String> {
    
        @Override
        public int compare(String arg0, String arg1) {
    
            int indexOf = arg0.indexOf("-");
            String substring = arg0.substring(0, indexOf-1);
            int indexOf1 = arg1.indexOf("-");
            String substring1 = arg1.substring(0, indexOf1-1);
            return Integer.valueOf(substring) - Integer.valueOf(substring1);
        }
    
    }
    
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    public class Runner {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            List<String> entries = new ArrayList<String>();
            entries.add("0 - name1");
            entries.add("1000 - name2");
            entries.add("1004 - name4");
            entries.add("1002 - name3");
            entries.add("10000 - name5");
            entries.add("2000 - name5");
    
            Comparator<String> comparator = new MyComparator();
            Collections.sort(entries, comparator );
    
            for (String e : entries){
                System.out.println(e);
            }
    
        }
    }
    

    另外 - 我强烈建议声明这样的列表:List&lt;String&gt; entries = new ArrayList&lt;String&gt;(); 稍后您可能会发现使用 LinkedList 代替 ArrayList 的好处 - 然后更改已用列表的实现将是最简单的可能。

    请谷歌“程序接口而不是实现”。 :)

    【讨论】:

    • 工作完美,非常感谢您的出色回答,我是一个快乐的露营者:) 哈,我也会使用您的建议,仍然学到很多东西
    • @GFlam 很高兴为您提供帮助。无论如何,如果你想了解更多——请按照@camickr 所说的去做——让你自己的类来保存这些值,在新的比较器中只需使用entry.getNumber() 并将其与nextEntry.getNumber() 进行比较。编写它会给您带来很多乐趣,并且使用它会带来更多乐趣:)
    • @dantuch,是的,知道如何编写比较器很重要,正如您在我的回答中评论的那样。但是,用勺子喂代码如何帮助发帖者呢?他们学到了什么?有数百个如何编写比较器的示例可以在论坛中找到。人们通过尝试来学习。
    • @camickr 我上面的评论是通过尝试来推动学习:) 至于我的完整工作解决方案 - 你必须原谅我,我今天非常想写一些代码! ;] 顺便说一句 - 我是你的回答的支持者之一 :)
    【解决方案3】:

    编写一个Comparator&lt;String&gt;,将- 处的输入拆分。用Integer.parseInt 解析第一个元素(必要时修剪)。比与精炼的整数值进行比较。
    代码:

    class MyComp implements Comparator<String> {
         public int compare(String s1, String s2) {
               int v1 = Integer.parseInt(s1.split("-")[0]);
               int v2 = Integer.parseInt(s2.split("-")[0]);
               return v1 - v2;
         }
    

    }

    【讨论】:

      【解决方案4】:

      您可以使用Collections#sort 的默认比较器,前提是您使用0102 形式的数字,而不是12

      否则,您可以创建自己的比较器,但我认为 @camickr 建议使用不同的表示形式更好。

      【讨论】:

        【解决方案5】:

        您对 ArrayList 的依赖程度如何?我不太确定您的整个应用程序,但是您的 ArrayList 条目的“数字 - 字符串”格式向我表明您实际上需要一个 Map。将其实现为 TreeMap,您可以免费对键进行排序。

        public static void main( String[] args ) {
            Map<Integer , String> map = new TreeMap<Integer , String>();
            map.put( 1, "name1" );
            map.put( 1000, "name2" );
            map.put( 1004, "name4" );
            map.put( 1002, "name3" );
            map.put( 10000, "name5" );
            map.put( 2000, "name5" );
        
            for ( Integer key : map.keySet() ) {
                System.out.println( String.format( "key: %d, value: %s", key, map.get( key ) ) );
            }
        }
        

        ...产生...

        key: 1, value: name1
        key: 1000, value: name2
        key: 1002, value: name3
        key: 1004, value: name4
        key: 2000, value: name5
        key: 10000, value: name5
        

        【讨论】:

          【解决方案6】:

          也许你想试试我的数字排序算法:

          package drawFramePackage;
          import java.awt.geom.AffineTransform;
          import java.util.ArrayList;
          import java.util.ListIterator;
          import java.util.Random;
          public class QuicksortAlgorithm {
              ArrayList<AffineTransform> affs;
              ListIterator<AffineTransform> li;
              Integer count, count2;
              /**
               * @param args
               */
              public static void main(String[] args) {
                  new QuicksortAlgorithm();
              }
              public QuicksortAlgorithm(){
                  count = new Integer(0);
                  count2 = new Integer(1);
                  affs = new ArrayList<AffineTransform>();
                  for (int i = 0; i <= 128; i++){
                      affs.add(new AffineTransform(1, 0, 0, 1, new Random().nextInt(1024), 0));
                  }
                  affs = arrangeNumbers(affs);
                  printNumbers();
              }
              public ArrayList<AffineTransform> arrangeNumbers(ArrayList<AffineTransform> list){
                  while (list.size() > 1 && count != list.size() - 1){
                      if (list.get(count2).getTranslateX() > list.get(count).getTranslateX()){
                          list.add(count, list.get(count2));
                          list.remove(count2 + 1);
                      }
                      if (count2 == list.size() - 1){
                          count++;
                          count2 = count + 1;
                      }
                      else{
                      count2++;
                      }
                  }
                  return list;
              }
              public void printNumbers(){
                  li = affs.listIterator();
                  while (li.hasNext()){
                      System.out.println(li.next());
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2019-08-02
            • 2017-06-07
            • 1970-01-01
            • 2013-08-20
            • 1970-01-01
            • 1970-01-01
            • 2014-11-09
            • 2013-11-29
            相关资源
            最近更新 更多