Java 获取下一个可用ID

Java 获取下一个可用ID,java,Java,我被卡住了,我不知道该怎么做 我想获得下一个可用的id。 如果存在[ID:1,ID:2,ID:3],findId()将返回4(下一个可用的ID) 如果ID:2被删除,我们会得到[ID:1,ID:3],所以现在它应该返回2 请帮忙 public int findId() { if (getAreas().isEmpty()) return 1; List<Area> areas = new ArrayList<>(getAreas()); ar

我被卡住了,我不知道该怎么做

我想获得下一个可用的id。 如果存在
[ID:1,ID:2,ID:3]
findId()
将返回
4
(下一个可用的ID)

如果
ID:2
被删除,我们会得到
[ID:1,ID:3]
,所以现在它应该返回
2

请帮忙

public int findId() {
   if (getAreas().isEmpty())
      return 1;
   List<Area> areas = new ArrayList<>(getAreas());
   areas.sort(Comparator.comparingInt(AutoPayArea::getId));

   for (int i = 1; i <= areas.size(); i++) {
      if (i < areas.get(i - 1).getId()) {
         return i;
      } else {
         return i + 1;
      }
   }
   return -1;
}
public int findId(){
if(getAreas().isEmpty())
返回1;
列表区域=新的ArrayList(getAreas());
areas.sort(Comparator.comparingInt(autopayrea::getId));
对于(int i=1;i
public int findId(){
if(getAreas().isEmpty())
返回1;
列表区域=新的ArrayList(getAreas());
areas.sort(Comparator.comparingInt(autopayrea::getId));
对于(int i=0;i(i+1)){
返回i+1;
}
}
返回区域。大小()+1;
}

如果我理解正确,在所有这些处理之后,
区域.get(I-1).getId()
返回一个从1到任意值的
int
,如果没有ID“丢失”,它将等于
I

因此,如果缺少相应的ID,或者只返回上次找到的ID之后的下一个ID,则需要返回
i

如果是这样的话:

public int findId() {
   if (getAreas().isEmpty())
      return 1;
   List<Area> areas = new ArrayList<>(getAreas());
   areas.sort(Comparator.comparingInt(AutoPayArea::getId));

   for (int i = 1; i <= areas.size(); i++) {
      if (i < areas.get(i - 1).getId()) {
         return i; // "i" is missing, return that
      }
   }
   // If we haven't returned yet, it means that no ID is missing,
   // so just return the next one, which is areas.size()+1 (which just happens to be "i" again but it's out of scope now).
   return areas.size()+1;
}
public int findId(){
if(getAreas().isEmpty())
返回1;
列表区域=新的ArrayList(getAreas());
areas.sort(Comparator.comparingInt(autopayrea::getId));

对于(int i=1;i代码中的主要问题是,对于
if/else
,无论发生什么情况,您都将在循环的第一次迭代中返回
1
2
。有关如何解决此问题,请参阅其他答案

但是,与排序然后迭代区域不同,我只是将已经获取的ID存储在一个
集中,然后迭代可能的ID并返回第一个不在该集中的ID

public int findId() {
    Set<Integer> ids = getAreas().stream()
            .map(Area::getId)
            .collect(Collectors.toSet());
    return IntStream.iterate(1, n -> n + 1)
            .filter(n -> ! ids.contains(n))
            .findFirst().getAsInt();
}

通常情况下,保持ID的连续性是没有意义的。当你的问题再次出现时,你的ID序列中总会有漏洞。现代计算机有足够的内存来处理大的数字类型,因此不需要限制它们的长度。此外,当ID被持久化到数据库中时,重用ID可能会产生奇怪的seide效果。因此,你不应该为了顺势疗法的改进而浪费计算机的CPU时间……下一个ID,下一个ID不需要我该怎么做@TimothyRuckleSort the
ArrayList
,然后按照你的要求取
最后一个条目+1
,-一点也不需要。你可以通过将下一个更大的ID放在树集中来轻松获得:
areaTreeSetSortedById.last().getId()+1
@max604这是错误的。返回
区域.size()
将返回列表中的最后一个ID,而不是下一个ID,并且您将得到重复的ID。无法返回i,因为它不在for的范围内。大多数人在使用简单for()时遇到问题loop将忽略使用流和选项的答案,因为这可能超出了他们当前的技能范围。但我喜欢你最后一段中的解决方案。+1。@walen OP在原始问题中已经使用了一些Java 8,所以我认为这应该是可以的。但是,当然,使用循环和条件可以在更多的行中完成同样的操作。Tbh这就是原因,我几乎不知道涵盖了什么,你知道有什么链接可以更深入地解释所使用的概念吗,我将勾选这一个。@Max604勾选最适合你的答案,如果是另一个,那就好了。对Java 8流的一般介绍肯定会有点宽泛,但你可以查看StackOverflows拥有
public int findId() {
    Set<Integer> ids = getAreas().stream()
            .map(Area::getId)
            .collect(Collectors.toSet());
    return IntStream.iterate(1, n -> n + 1)
            .filter(n -> ! ids.contains(n))
            .findFirst().getAsInt();
}
public int findId() {
    return getAreas().stream().mapToInt(Area::getId).max().orElse(0) + 1;
}