Java 获取下一个可用ID
我被卡住了,我不知道该怎么做 我想获得下一个可用的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: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;ipublic 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 theArrayList
,然后按照你的要求取最后一个条目+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;
}