java有序集合_Java 中怎样实现一种即使元素改变依然有序的集合?

本文探讨了一个游戏项目中如何在不使用Collections.sort()方法的情况下维护玩家排行榜的有序状态。作者尝试通过继承TreeSet并实现回调接口ReorderCallback,在玩家状态变化时重新排序,但遇到问题:当玩家等级改变时,集合并未正确更新。示例代码展示了在更新玩家状态后,集合未跟踪元素变化导致排序错误。作者寻求解决方案,希望能有一种方式在元素值改变后自动保持集合有序。
摘要由CSDN通过智能技术生成

一个游戏项目,服务器需要维护一个玩家的有序集合(排行榜),玩家的一些动作会改变自身的状态,比如等级改变。我希望在不使用 Collections.sort() 方法的情况下维持这个集合的有序状态。

我尝试了继承了 TreeSet 然后实现一个重新排序的回调 ReorderCallback,在任何玩家经验值改变的时候调用回调的方法 reorder() 来使集合(排行榜)保持有序,代码如下

interface ReorderCallback {

void reorder(T element);

}

class AlwaysOrderedSet extends TreeSet implements ReorderCallback {

// ...

@Override

public void reorder(T element) {

remove(element);

add(element);

}

}

然后调用 AlwaysOrderedSet

AlwaysOrderedSet set = new AlwaysOrderedSet<>();

player.setExp(xxxxx);

set.reorder(player);

然而,每次玩家状态改变后调用 reorder() 并不能保持原集合的有序,反而会重复添加 player。因为 TreeSet 无法追踪元素的变化,就像以下的演示一样,

public class Sorter {

public static void main(String[] args) {

class Student implements Comparable {

int id;

String name;

int age;

Student(int id, String name, int age) {

this.id = id;

this.name = name;

this.age = age;

}

@Override

public String toString() {

return String.format("id=%d, name=%s, age=%d", id, name, age);

}

@Override

public int compareTo(Student o) {

return o.age - this.age;

}

}

Set alwaysOrdered = new TreeSet<>();

Student a = new Student(1, "Amy", 50);

Student b = new Student(2, "Bob", 30);

Student c = new Student(3, "Chris", 40);

alwaysOrdered.add(a);

alwaysOrdered.add(b);

alwaysOrdered.add(c);

System.out.println("-- before --");

alwaysOrdered.forEach(System.out::println);

b.age = 100;

System.out.println("-- after --");

alwaysOrdered.forEach(System.out::println);

alwaysOrdered.remove(b);

alwaysOrdered.add(b);

System.out.println("-- after remove and add --");

alwaysOrdered.forEach(System.out::println);

}

}

结果是

-- before --

id=1, name=Amy, age=50

id=3, name=Chris, age=40

id=2, name=Bob, age=30

-- after --

id=1, name=Amy, age=50

id=3, name=Chris, age=40

id=2, name=Bob, age=100

-- after remove and add --

id=2, name=Bob, age=100

id=1, name=Amy, age=50

id=3, name=Chris, age=40

id=2, name=Bob, age=100

对 b 的更改并没有改变其在集合中的位置。移除 b 再添加 b 后反而元素变多了,即一开始就移除失败了。

所以我想问一下,有没有一种模式或者类能提供一种结构使得集合中元素值变化后,通过某种回调来使集合依旧有序?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值