2016-12-25 69 views
1

我想排序對象的數組列表,其中null或空對象必須位於ArrayList.Here的最後我基於兩個屬性進行排序,名稱和金額。在排序時在數組列表中的最後一個位置放置一個空或空對象

public int compare(Object o1, Object o2) { 
     String username1=((User) o1).getName(); 
     String username2=((User) o2).getName(); 
     int namecomp=username1.compareTo(username2); 
      if(namecomp!=0){ 
       return namecomp; 
      } 
      else{ 
       Integer useramount1= ((User) o1).getAmount(); 
       Integer useramount2=((User) o2).getAmount(); 
       return useramount1.compareTo(useramount2); 
      } 
     } 
    }); 
+0

你嘗試過關於null元素的分選什麼? – luk2302

+0

是的,它工作正常的非空元素。 –

回答

3

從Java 8中,這個功能已經存在於庫中,Comparator.nullsLast

Collections.sort(coll, Comparator.nullsLast(new YourComparator())); 

您當前的比較,因爲它是將工作, 的Comparator.nullsLast將處理null元素,讓他們去持續。


如果需要使用Java 7,您可以確保null值獲得在年底通過返回適當的值從compare取決於o1o2空,兩者均分類:

  • 則返回0 o1o2均爲null
  • 返回1,如果是o1nullo2
  • 返回-1 o1nullo2

完整Comparator類可以這樣進行:

static class UserComparator implements Comparator<User> { 
    @Override 
    public int compare(User o1, User o2) { 
     if (o1 == null) { 
      return (o2 == null) ? 0 : 1; 
     } 
     if (o2 == null) { 
      return -1; 
     } 

     String username1 = o1.getName(); 
     String username2 = o2.getName(); 
     int namecomp = username1.compareTo(username2); 
     if (namecomp != 0) { 
      return namecomp; 
     } else { 
      Integer useramount1 = o1.getAmount(); 
      Integer useramount2 = o2.getAmount(); 
      return useramount1.compareTo(useramount2); 
     } 
    } 
} 

我也是在您的文章糾正方法簽名。

你可以使用這個比較是這樣的:

Collections.sort(users, new UserComparator()); 

如果usernameamount字段都爲空, 那麼你可以申請同樣的理念,那些過於:

static class UserComparator implements Comparator<User> { 
    @Override 
    public int compare(User o1, User o2) { 
     if (o1 == null) { 
      return (o2 == null) ? 0 : 1; 
     } 
     if (o2 == null) { 
      return -1; 
     } 

     String username1 = o1.getName(); 
     String username2 = o2.getName(); 
     if (username1 == null) { 
      return username2 == null ? 0 : 1; 
     } 
     if (username2 == null) { 
      return -1; 
     } 

     int namecomp = username1.compareTo(username2); 
     if (namecomp != 0) { 
      return namecomp; 
     } 

     Integer useramount1 = o1.getAmount(); 
     Integer useramount2 = o2.getAmount(); 
     if (useramount1 == null) { 
      return useramount2 == null ? 0 : 1; 
     } 
     if (useramount2 == null) { 
      return -1; 
     } 
     return useramount1.compareTo(useramount2); 
    } 
} 
+0

這個功能是否存在於Java 7中? –

+0

不,它是Java 8.你需要Java 7嗎? – janos

+0

我試着用Collections.sort(list,Comparator.nullsLast(new Comparator())); –

0

I'm working on Java 7

對於更可重複使用的解決方案,您可以使用Bean ComparatorGroup Comparator

  1. BeanComparator讓您排序對象中的任何屬性,並允許您控制空排序

  2. GroupComparator可以將多個Comparator合併成一個單一Comparator

所以基本邏輯是:

BeanComparator name = new BeanComparator(User.class, "getName"); 
BeanComparator amount = new BeanComparator(User.class, "getAmount"); 
GroupComparator gc = new GroupComparator(name, amount); 
+0

你能否提供更多的細節? –

+0

@VibhorSrivastava,你需要些什麼細節?閱讀鏈接下載代碼並使用上述3行。這些類的重點在於,您無需在每次想對任何類的屬性進行排序時編寫自定義代碼。 – camickr

相關問題