按两个条件对hashSet进行排序

Sort hashSet by two conditions

我想按 nameplace 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"));