Java 获取数组中缺少的数字

Java 获取数组中缺少的数字,java,arrays,if-statement,for-loop,Java,Arrays,If Statement,For Loop,我有一个带数字的数组,但该数组没有排序。用户可以从阵列中删除数字。但是用户应该能够在以后添加数字 基本上我想在数据库中写入id。用户可以删除行,但如果他添加一行,id应该是删除行中缺少的数字 目前我是这样解决的: for (Object[] object : data) { if ((int) object[1] > id) { id = (int) object[1]; } } 但是有了这个,我只得到了最大的数字,而不是丢失的数字。我怎样才能得到一个丢失

我有一个带数字的数组,但该数组没有排序。用户可以从阵列中删除数字。但是用户应该能够在以后添加数字

基本上我想在数据库中写入id。用户可以删除,但如果他添加一行,id应该是删除行中缺少的数字

目前我是这样解决的:

for (Object[] object : data) {
    if ((int) object[1] > id) {
        id = (int) object[1];
    }
}
但是有了这个,我只得到了最大的数字,而不是丢失的数字。我怎样才能得到一个丢失的号码

例如:

4,2,3,1用户删除第2行和第4行,因此我有

3,1现在我想计算或使用if语句得到2,如果用户再添加一行,则返回4

请记住,用户可以关闭程序,因此无法将数字保存在其他数组中

  • 谢谢你的帮助

一种方法是维护一个包含已删除号码的并行阵列

Object[] data = ...;
Object[] delData = ...;

因此,每次插入/添加一个新数字时,您都需要检查该数字是否存在于并行数组中。

根据您的示例,将数字从头到尾相加,1+2+3+4=10,然后减去您拥有的数字之和,1+2+4=7

所以10-7=3(缺失的数字)

----------------------------------------------------编辑---------------- 这个怎么样

public class SandBox7 {
public static void main(String[] args) {
    Integer[] array = new Integer[] { 1, 4, 9 };
    SandBox7 s = new SandBox7();
    List<Integer> mis = s.getMissingNumbers(array);
}

public List<Integer> getMissingNumbers(Integer[] in) {
    int max = getMaximum(in);
    // System.out.println(max);
    List<Integer> numbers = Arrays.asList(in);

    ArrayList<Integer> missing = new ArrayList<>();
    for (int i = 1; i < max; i++) {

        if (!numbers.contains(i)) {
            missing.add(i);
        }
    }
    return missing;
}

private int getMaximum(Integer[] in) {
    int tmp = -1;
    for (int i = 0; i < in.length; i++) {
        if (tmp < in[i])
            tmp = in[i];
    }
    return tmp;
}

}
公共类沙盒7{
公共静态void main(字符串[]args){
整数[]数组=新整数[]{1,4,9};
sandbox7s=新的SandBox7();
列表mis=s.GetMissingNumber(数组);
}
公共列表GetMissingNumber(整数[]in){
int max=getmax(in);
//系统输出打印项次(最大值);
列表编号=数组.asList(in);
ArrayList missing=新的ArrayList();
对于(int i=1;i
查看下面的代码..可能会有所帮助

    int data[]={1,2,4};
    int i=1;
    for(Object object : data){
        if((Integer)object!=i++)
            break;
    }
    System.out.println(i-1);//This will print 3.

你有一些可能性,这是一个你必须自己决定的设计问题。只是一些替代方案:

  • 最佳:删除时重新编号ID,但需要关于引用外键的元信息

  • 如果数据是按ID排序的。 未重新编号时的删除次数:

    int deletions = data.length
                    - (data.length == 0 ? 0 : data[data.length - 1][1]);
    
    通过二进制搜索,可以找到已删除的孔(移位编号)

  • 无序的。保留删除的数量。 将
    数据的
    位集
    保持为无界。长度

    或者选择一个带有删除的
    集合。当集合变得太大时重新编号。(一组从ID到ID的范围会更好。)


  • 如果你在临时存储器中对id进行排序,那么很容易找到第一个丢失的号码

    int arr[] = {0,1,2,5}; //think you've the sorted array now
    int missing = arr.length; //would have the last id+1 if there is no missing id
    for (int i = 0; i < arr.length; i++) {
        if (i != arr[i]) {
             missing = i;
             break;
        }
    }
    System.out.println(missing); //3 will be printed.
    
    intarr[]={0,1,2,5}//你现在已经得到排序数组了吗
    int missing=arr.length//如果没有缺少id,则将具有最后一个id+1
    对于(int i=0;i
    您能更清楚地回答您的问题吗?意思是请给出一些例子。
    数据
    如果只包含整数,为什么是一个
    对象
    s数组?@AnthonyGrist这只是原始的一个例子,我使用这个对象是因为它是一个jtabelc的数据。你能不能在临时存储器中对数据进行排序并找到第一个缺失的数字?@nommyravian是的,这一点不错开始,但现在我如何获得排序数组的第一个缺失数?它不是最大的,也不是最小的,所以我实际上不能使用if或?这实际上是不可能的,因为如果用户关闭程序,我会丢失数组的数据,无法获取。如果缺少多个数字呢?@Gerret我以为你只需要一个,抱歉,但是在这种情况下,您必须在删除时将数字保存到集合中,以便基本上获得最大的数字计数,并检查该数字是否在数组中。这是一个非常好的解决方案,可能不是最好的编码方式:D,但谢谢你^^我现在使用了类似的答案,但基本上你给了我一个想法,请解释if语句for meIf语句将检查序列的连续性。例如,它用一个所谓的计数器i检查
    数据的1,2,4值,该计数器i在每个循环语句后递增,当它遇到缺少3时将中断。是的,但i++1是什么?是的,我对java并不陌生,但我还没有看到xD@Gerret希望这对你有用,并且这个答案是正确的……)我不懂你的代码,你能不能简化一下,或者给我解释一下?我无法重新编号ID,因为这需要很长时间!目前我不使用多任务处理,因此用户必须等待所有数据库行被编辑。如果从n中删除I,则可以将n复制到I并减少n。可能也不合适。也许您真的应该看看嵌入式数据库,比如JavaDerby、HSQL或其他什么。它还提供持久性和查询。