java—每次添加新磁道时递增计数器,并始终选择尚未分配的最小值(>=1)

z4bn682m  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(393)

我目前正在进行一个列车模拟项目,我有一个列表,其中保存了所有轨道:

  1. private List<Track> tracks;
  2. public void addTrack(Track track) {
  3. this.tracks.add(track);
  4. }
  5. public void removeTrack(Track track) {
  6. if (!tracks.contains(track)) {
  7. this.tracks.remove(track);
  8. } else {
  9. Terminal.printError("track with id " + track.getId() + " doesn't exist.");
  10. }
  11. }

我想在添加每个音轨时为它分配一个id(从1开始)。此外,总是选择下一个空闲id。例如,如果分配了id 1、3、4、5,则使用下一个id 2。
e。g、 地址:
添加曲目…->编号:1
添加曲目…->编号:2
拆下履带1
添加曲目…->编号:1
我会使用一个Map,每次我添加一个新的轨道,增加一个计数器。但是,如果我删除了一个id,并添加了一个新的轨道将有“差距”。
做这件事的好方法是什么?

9q78igpj

9q78igpj1#

就像赛义夫·阿西夫在回答中提到的那样,你可以使用另一个数据结构来跟踪id。
bitset是一种方法,另一种方法是使用treeset跟踪您分配和撤销的id,这将使id保持有序
例如

  1. public class IdTracker {
  2. private TreeSet<Long> available;
  3. private TreeSet<Long> current;
  4. public IdTracker() {
  5. this.available = new TreeSet<Long>();
  6. this.current = new TreeSet<Long>();
  7. }
  8. public long getNextId() {
  9. //Check to see if this is the first time being called, setting initial id to 1
  10. if (available.isEmpty() && current.isEmpty()) {
  11. current.add(1L);
  12. return 1L;
  13. }
  14. //Check to see if we have any available values to use
  15. if (!available.isEmpty()) {
  16. //Remove from available and assign to current
  17. Long availableId = available.first();
  18. available.remove(availableId);
  19. current.add(availableId);
  20. return availableId;
  21. }
  22. //There are no available id's, get the highest current id and increment
  23. Long highestCurrentId = current.last();
  24. Long nextId = highestCurrentId + 1;
  25. current.add(nextId);
  26. return nextId;
  27. }
  28. public void removeId(long id) {
  29. //Remove from the current (if there) and place into available
  30. if (current.remove(id)) {
  31. available.add(id);
  32. } else {
  33. //Handle your failure case
  34. }
  35. }
  36. }

所以在你的例子中

  1. private List<Track> tracks;
  2. private IdTracker idTracker;
  3. public void addTrack(Track track) {
  4. long id = idTracker.getNextId();
  5. track.setId(id);
  6. this.tracks.add(track);
  7. }
  8. public void removeTrack(Track track) {
  9. if (tracks.contains(track)) {
  10. this.tracks.remove(track);
  11. this.idTracker.removeId(track.getId());
  12. } else {
  13. Terminal.printError("track with id " + track.getId() + " doesn't exist.");
  14. }
  15. }
展开查看全部
jw5wzhpr

jw5wzhpr2#

一种方法是在另一个数据结构(可能是位集)中跟踪每个分配的id,特别是位集#nextclearbit(int)方法
所以每次你把东西放进 List<Tracks> ,则在位集中设置相对索引,并在 Track 已删除。
像下面这样

  1. BitSet b = new BitSet();
  2. // set the bits while adding tracks
  3. b.set(0);
  4. b.set(1);
  5. b.set(2);
  6. b.clear(1); // some track gets removed, so unset the bit
  7. System.out.println(b); // {0, 2}
  8. System.out.println(b.nextClearBit(0)); // 1

相关问题