java - 对对象进行排序的数据结构

标签 java data-structures

我正在寻找一种可以根据给定整数对对象进行排序的数据结构。像这样:

Object    Score
Object1   86
Object2   85
Object3   85 

每个对象都是唯一的,但可以有重复的分数。试图设计一种方法来说明 Map 对象如何执行此操作,但无法弄清楚。

结构可以在插入期间/之后对对象进行排序,或者当我隐式调用排序时。

是否已经有一个结构可以做到这一点?还是我应该自己编码?

最佳答案

如果您想要唯一值,请尝试将对象放在 SortedSet 中;如果您想要查看重复项,请尝试将对象放在 List 中,以及自定义 Comparator 根据他们的“分数”对他们进行排序。

提供您自己的比较器将允许您指定对象应该根据它们的 score 字段排序以及如何排序。

比较器也是可重复使用的,如果您愿意,可以轻松换入/换出,比如对项目进行降序排序。

举个例子:

  class ScoreComparator implements Comparator <ObjectHolder> {
    @Override
    public int compare(ObjectHolder o1, ObjectHolder o2) {
      return o1.getScore().compareTo(o2.getScore());
    }
  }

  class DescendingScoreComparator implements Comparator <ObjectHolder> {
    @Override
    public int compare(ObjectHolder o1, ObjectHolder o2) {
      return o2.getScore().compareTo(o1.getScore());
    }
  }


  class ObjectHolder {
    Object obj;
    Integer score;

    public ObjectHolder(Object o, Integer score) {
      this.obj = o;
      this.score = score;
    }

    public Object getObject() {
      return obj;
    }
    public Integer getScore() {
      return score;
    }
  }


  public void showExample() {
    SortedSet<ObjectHolder> sortedSet = new TreeSet<ObjectHolder>(new ScoreComparator());
    sortedSet.add(new ObjectHolder("addedFirst", 55));
    sortedSet.add(new ObjectHolder("addedSecond", 25));
    sortedSet.add(new ObjectHolder("addedThird", 75));
    sortedSet.add(new ObjectHolder("addedFourth", 25));
    sortedSet.add(new ObjectHolder("addedFifth", 95));

    // The resulting set will only have 4 items since sets don't allow duplicates
    for (ObjectHolder holder : sortedSet) {
      System.out.println(holder.getScore());
    }

    List<ObjectHolder> list = new LinkedList<ObjectHolder>();
    list.add(new ObjectHolder("addedFirst", 55));
    list.add(new ObjectHolder("addedSecond", 25));
    list.add(new ObjectHolder("addedThird", 75));
    list.add(new ObjectHolder("addedFourth", 25));
    list.add(new ObjectHolder("addedFifth", 95));

    Collections.sort(list, new ScoreComparator());

    // The resulting set will only have 5 items since lists allow duplicates
    System.out.println();
    for (ObjectHolder holder : list) {
      System.out.println(holder.getScore());
    }

    Collections.sort(list, new DescendingScoreComparator());

    System.out.println("\nWill print 5 items, but this time in descending order");
    for (ObjectHolder holder : list) {
      System.out.println(holder.getScore());
    }
  }

下面是上面代码的输出:

Will print 4 unique items since sets don't allow duplicates

25 55 75 95

Will print 5 items since lists do allow duplicates

25 25 55 75 95

Will print 5 items, but this time in descending order

95 75 55 25 25

关于java - 对对象进行排序的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946104/

相关文章:

java - 如何删除窗口调整大小时的黑色矩形?

python - 如何在此(简单的)python 程序中正确使用递归?

python - 如何在不删除项目的情况下获取队列中的项目?

haskell - 维护插入顺序的 Set-Like 数据结构?

java - Huxley : java. util.NoSuchElementException:找不到行

JavaFX WebEngine 设置文档位置

java - preparedStatement 中的列索引无效

java - 使用不同的基线来查询数据

java - 如何在 Java 中创建链表数据结构?

c++ - 在现代 C++ 中实现专门的数据结构