2016-03-04 72 views
-3

我想按升序对ArrayList进行排序,但希望将项目从一个字符开始(例如:说'S')放在顶部。我试图用比较器来实现这一点。按升序对ArrayList进行排序并给出字符优先级(Java)

Collections.sort(mSearchHolder.get(1).contactList, new Comparator<SearchData>() { 
       @Override 
       public int compare(SearchData s1, SearchData s2) { 
        int returnValue = 0; 
        if(!s1.getName().toLowerCase().startsWith(search.toLowerCase()) 
          && !s2.getName().toLowerCase().startsWith(search.toLowerCase())) { 
         returnValue = s1.getName().compareToIgnoreCase(s2.getName()); 
        } else if(s1.getName().toLowerCase().startsWith(search.toLowerCase()) 
          && s2.getName().toLowerCase().startsWith(search.toLowerCase())) { 
         returnValue = s1.getName().compareToIgnoreCase(s2.getName()); 
        } else { 
         if(s1.getName().toLowerCase().startsWith(search.toLowerCase())) { 
          returnValue = 1; 
         } else if(s2.getName().toLowerCase().startsWith(search.toLowerCase())) { 
          returnValue = -1; 
         } 
        } 
        return returnValue; 
       } 
      }); 

这不起作用。有什么建议么?

谢谢。

+0

什么不工作?预期的产出是什么,你得到了什么产出? – Eran

+0

“aa”和“as”的输出应该是什么? –

回答

0

你只需要翻转-1和1返回的情况。

如果只有s1匹配S,那么s1在s2之前,所以返回-1。

如果只是S2匹配S,那么S2是S1之前,所以返回1

Collections.sort(mSearchHolder.get(1).contactList, new Comparator<SearchData>() { 
       @Override 
       public int compare(SearchData s1, SearchData s2) { 
        int returnValue = 0; 
        if(!s1.getName().toLowerCase().startsWith(search.toLowerCase()) 
          && !s2.getName().toLowerCase().startsWith(search.toLowerCase())) { 
         returnValue = s1.getName().compareToIgnoreCase(s2.getName()); 
        } else if(s1.getName().toLowerCase().startsWith(search.toLowerCase()) 
          && s2.getName().toLowerCase().startsWith(search.toLowerCase())) { 
         returnValue = s1.getName().compareToIgnoreCase(s2.getName()); 
        } else { 
         if(s1.getName().toLowerCase().startsWith(search.toLowerCase())) { 
          returnValue = -1; 
         } else if(s2.getName().toLowerCase().startsWith(search.toLowerCase())) { 
          returnValue = 1; 
         } 
        } 
        return returnValue; 
       } 
      }); 
0

也许是这样的:

public class TestSort { 

    static String search = "S"; 


    public static void main(String[] args) { 
     List<SearchData> searchCollection = new ArrayList<SearchData>(); 
     searchCollection.add(new SearchData("Sting")); 
     searchCollection.add(new SearchData("Maria")); 
     searchCollection.add(new SearchData("Sarah")); 
     searchCollection.add(new SearchData("Andrea")); 
     searchCollection.add(new SearchData("Sergio")); 
     searchCollection.add(new SearchData("Gustav")); 

     Collections.sort(searchCollection, new Comparator<SearchData>() { 

      public int compare(SearchData s1, SearchData s2) { 
       String s1name = s1.getName().toLowerCase(); 
       String s2name = s2.getName().toLowerCase(); 
       String searchLower = search.toLowerCase(); 
       int returnValue = 0; 
       if (!s1name.startsWith(searchLower) 
         && !s2name.startsWith(searchLower)) { 
        returnValue = s1name.compareTo(s2name); 
       } else if (s1name.startsWith(searchLower) 
         && s2name.startsWith(searchLower)) { 
        returnValue = s1name.compareTo(s2name); 
       } else { 
        if (s1name.startsWith(searchLower) && !s2name.startsWith(searchLower)) { 
         returnValue = -1; 
        } else if (!s1name.startsWith(searchLower) && s2name.startsWith(searchLower)) { 
         returnValue = 1; 
        } 
       } 
       return returnValue; 
      } 
     }); 

     for(SearchData s : searchCollection) { 
      System.out.println(s.getName()); 
     } 
    } 
} 

它给人的输出:

Sarah 
Sergio 
Sting 
Andrea 
Gustav 
Maria