【问题标题】:Java, special sort an ArrayList with longer entries at the endJava,特殊排序一个 ArrayList,最后有更长的条目
【发布时间】:2013-06-24 23:46:39
【问题描述】:

我在 Java 中有一个 ArrayList<String>。现在我想根据一些要求对其进行排序。

例如,我在 ArrayList 中有这些项目:

xyz
bcd
abc_locked
cde
efg_locked
fgh

我想推回最后带有_locked 的那些并保持顺序,以便:

xyz
bcd
cde
fgh
abc_locked
efg_locked

最好的方法是什么?我是否必须遍历列表删除字符串并再次添加它?还是有更好的方法?

【问题讨论】:

  • 你有没有尝试过?
  • 提示:Collections.sort(yourList, customComparator);
  • @M4tchB0X3r:如果你展示你的尝试,我相信有人会愿意帮助你。但是,在你不付出任何努力的情况下完成你的工作可能不会发生......
  • xyz 必须排在排序列表的首位?

标签: java android sorting arraylist


【解决方案1】:

你可以试试这个比较器:

Comparator<String> comparator = new Comparator<String>() {

     @Override
     public int compare(String arg1, String arg2) {

         if (arg1.matches("^.*_locked$") && arg2.matches("^.*_locked$")) {
             // Both string have _locked at the end. Retain the order.
             return 0;
         } else if (arg1.matches("^.*_locked$")) {
             // First string have _locked. Swap.
             return 1;
         } else if (arg2.matches("^.*_locked$")) {
             // Second string have _locked. No need to swap
             return -1;
         } 

         // None of the string have _locked. Retain the order
         return 0;

     }
};

Collections.sort(list, comparator);

【讨论】:

  • 真棒谢谢。正是我想要的。我试过的第一个,所以我接受了。谢谢@所有
【解决方案2】:

使用比较器:

Collections.sort(list, new Comparator(){
    public int compare(String o1, String o2) {
        if ((o1.endsWith("_locked")&&(!o2.endsWith("_locked"))){
            return 1;
        }
        else if (!(o1.endsWith("_locked")&&(o2.endsWith("_locked"))){
            return 1;
        }
        else {
            //Fallback sorting based on start of string left as exercise to reader
        }
    }

});

【讨论】:

    【解决方案3】:

    您可以尝试使用匿名参数化比较器,例如:

    ArrayList<String> myList = new ArrayList<String>();
    myList.add("xyz");
    myList.add("bcd");
    myList.add("abc_locked");
    myList.add("cde");
    myList.add("efg_locked");
    myList.add("fgh");
    Collections.sort(myList, new Comparator<String>() {
        @Override
        public int compare(String arg0, String arg1) {
            if (!arg0.contains("_locked") && !arg1.contains("_locked")) {
                return arg0.compareTo(arg1);
            }
            else if (arg0.contains("_locked") && arg1.contains("_locked")) {
                return arg0.compareTo(arg1);
            }
            else if (arg0.contains("_locked")) {
                return 1;
            }
            else {
                return -1;
            }
        };
    });
    System.out.println(myList);
    

    输出:

    [bcd, cde, fgh, xyz, abc_locked, efg_locked]
    

    【讨论】:

      【解决方案4】:
      Comparator<String> comparator = new Comparator<String>() {
      
       @Override
       public int compare(String arg1, String arg2) {
      
           if (arg1.endsWith("_locked") && arg2.endsWith("_locked")) {
               return 0;
           } else if (arg1.endsWith("_locked")) {
               return 1;
           } else if (arg2.endsWith("_locked")) {
               return -1;
           } 
           return 0;
       }
      };
      

      【讨论】:

        【解决方案5】:

        你可以试试这个

        Collections.sort(list, new Comparator() {
                    @Override
                    public int compare(String s1, String s2) {
        
                        // ascending order
                         return id1.compareTo(id2);
        
                        // descending order
                        //return id2.compareTo(id1);
                    }
                });
        

        对于对象的集合

        /*
          Here myItems is an arraylist MyItem added randomly 
          MyItem got a property int id 
          This method provide me myItems in ascending order of id's
        */
        Collections.sort(myItems, new Comparator<MyItem>() {
        
                    @Override
                    public int compare(MyItem lhs, MyItem rhs) {
                        // TODO Auto-generated method stub
        
                        int lhsId = lhs.getId();
                        int rhsId = rhs.getId();
        
                        return lhsId>rhsId ? 1 : -1;
                    }
                }); 
        

        当然你也可以参考this

        【讨论】:

        • 因为 OP 处理的是String 而不是MyItem。这个答案基本上与问题无关。
        猜你喜欢
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        相关资源
        最近更新 更多