2015-04-17 28 views
0

我想對以下的類別進行排序帶有ID的地方類別:-1,0開頭按兩個條件對hashSet進行排序

public class Category { 
    Long id; 
    String name; 

    public Category(Long id, String name) { 
     this.id=id; 
     this.name=name; 
    }  
} 

Set<Categories> categories = new HashSet<>; 
categories.add(new Category(2,"Drama")) 
categories.add(new Category(-1,"Favorites")) 
categories.add(new Category(3,"Cartoons")) 
categories.add(new Category(1,"Biography")) 
categories.add(new Category(0,"All")) 

如何得到這樣的列表?

[{-1,"Favorites"}, {0,"All"}, {3,"Cartoons"}, {1,"Drama"}, {2,"Historical"}] 

P.S.我有番石榴 lib

+0

我們不在這裏做核心寫作要求。描述您在嘗試編寫代碼時遇到的問題,我們會盡力幫助您解決問題。 – Pshemo

+0

如果要將實例存儲在Set中,則應在'Category'類中實現'hashCode'和'equals'。 –

回答

1

使它成爲一個列表和排序是:

Collections.sort(categories, (a, b) -> { 
    if (a.id != b.id) { 
     if (a.id == -1) { 
      return -1; 
     } 
     if (b.id == -1) { 
      return 1; 
     } 
     if (a.id == 0) { 
      return -1; 
     } 
     if (b.id == 0) { 
      return 1; 
     } 
    } 
    return a.name.compareTo(b.name); 
}); 
+0

感謝您的回答!你寫了我需要的 - 相當的功能! – Dmitry1405

2

使用TreeSet而不是HashSet並讓Category實現Comparable(並按您的意願實現compareTo)。 TreeSet將存儲一組有序的對象。

public class Category implements Comparable<Category> 
{ 
    private final int id; 
    private final String name; 

    public int getId() 
    { 
    return id; 
    } 

    public String getName() 
    { 
    return name; 
    } 

    public Category(int id, String name) 
    { 
    this.id = id; 
    this.name = name; 
    } 



    @Override 
    public int compareTo(Category category) 
    { 
    return this.getId() - category.getId(); 
    } 

    public static void main(String[] args) 
    { 
    Set<Category> categories = new TreeSet<>(); 
    categories.add(new Category(2, "Drama")); 
    categories.add(new Category(-1, "Favorites")); 
    categories.add(new Category(3, "Cartoons")); 
    categories.add(new Category(1, "Biography")); 
    categories.add(new Category(0, "All")); 

    for (Category category : categories) 
    { 
     System.out.println(category.getId()); 
    } 

    } 
} 
0

首先,您的代碼存在問題。 HashSet通過首先檢查對象的hashCode()來檢查對象是否已經存在,然後通過調用equals()來確保它是同一個對象。如果你沒有定義這兩個函數,不管你輸入什麼值,你的所有類別對象都會有所不同。

其次,排序對象,你最好讓他們可比通過實施 可比<分類>

最後,HashSet的不守內對象的任何命令。如果您使用TreeSet而不是HashSet,您將自然獲得訂單。

0

HashSet中不具有有序集合。

如果你想要有序集,你使用了java.util.TreeSet。

要使用java.util.TreeSet,您必須更改implements java.lang.Comparable的Category,並且您實現了方法compareTo以提供比較方法或您在java.util.TreeSet構造函數中使用java.util.Comparator。

樣品與比較:

用法:

Set<Category> categories = new TreeSet<>(new Comparator<Category>() { 

    @Override 
    public int compare(Category o1, Category o2) { 
     return o1.getId().compareTo(o2.getId()); 
    } 
}); 
categories.add(new Category(2, "Drama")); 
categories.add(new Category(-1, "Favorites")); 
categories.add(new Category(3, "Cartoons")); 
categories.add(new Category(1, "Biography")); 
categories.add(new Category(0, "All")); 

樣品相媲美:

Category.java

public class Category implements Comparable<Category> { 

    private Integer id; 
    private String name; 

    public Category() { 
    } 

    public Category(Integer id, String name) { 
     super(); 
     this.id = id; 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public int compareTo(Category o) { 
     return id.compareTo(o.id); 
    } 

} 

用法:

Set<Category> categories = new TreeSet<>(); 
categories.add(new Category(2, "Drama")); 
categories.add(new Category(-1, "Favorites")); 
categories.add(new Category(3, "Cartoons")); 
categories.add(new Category(1, "Biography")); 
categories.add(new Category(0, "All"));