按两个条件对hashSet进行排序
Sort hashSet by two conditions
我想按 name 和 place categories 对以下类别进行排序,ids: -1, 0 in begin.
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。我有 番石榴 库
使用 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());
}
}
}
首先,你的代码有问题。 HashSet 通过首先检查对象的 hashCode() 然后通过调用 equals() 确保它是同一个对象来检查对象是否已经存在。如果您不定义这两个函数,那么无论您在其中输入什么值,您所有的类别对象都将不同。
其次,要对对象进行排序,您最好通过实现来使它们具有可比性
可比<类别>
最后,HashSet不保持里面对象的任何顺序。如果你用TreeSet而不是HashSet,自然会得到顺序。
将其列为列表并排序:
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);
});
HashSet 没有有序集。
如果你想要Ordered Set,你可以使用java.util.TreeSet。
要使用 java.util.TreeSet,您必须更改工具的类别 java.lang.Comparable 并且您实施方法 compareTo 以提供比较方法,或者您 java.util.Comparator 在 java.util.TreeSet 构造函数中。
带有比较器的样本:
用法:
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"));
我想按 name 和 place categories 对以下类别进行排序,ids: -1, 0 in begin.
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。我有 番石榴 库
使用 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());
}
}
}
首先,你的代码有问题。 HashSet 通过首先检查对象的 hashCode() 然后通过调用 equals() 确保它是同一个对象来检查对象是否已经存在。如果您不定义这两个函数,那么无论您在其中输入什么值,您所有的类别对象都将不同。
其次,要对对象进行排序,您最好通过实现来使它们具有可比性 可比<类别>
最后,HashSet不保持里面对象的任何顺序。如果你用TreeSet而不是HashSet,自然会得到顺序。
将其列为列表并排序:
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);
});
HashSet 没有有序集。
如果你想要Ordered Set,你可以使用java.util.TreeSet。
要使用 java.util.TreeSet,您必须更改工具的类别 java.lang.Comparable 并且您实施方法 compareTo 以提供比较方法,或者您 java.util.Comparator 在 java.util.TreeSet 构造函数中。
带有比较器的样本:
用法:
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"));