我有一个数字数组,该数组未排序。用户可以从阵列中删除数字。但是用户应该可以稍后添加数字。
基本上我想在数据库中写入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。
请注意,用户可以关闭 程序,因此无法保存 其他阵列!
答案 0 :(得分:1)
从您的示例中,将数字从开头到结尾相加,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;
}
}
答案 1 :(得分:1)
请看下面的代码..可能会有所帮助
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.
答案 2 :(得分:0)
一种方法可能是维护一个包含已删除数字的并行数组。
Object[] data = ...;
Object[] delData = ...;
因此,每次插入/添加新数字时,都需要检查该数字是否存在于并行数组中。
答案 3 :(得分:0)
你有一些可能性,这是一个设计问题你必须自己决定。只是一些替代方案:
最佳:删除时重新编号ID,但需要有关引用外键的元信息。
如果按ID排序数据。 未重新编号时的删除次数:
int deletions = data.length
- (data.length == 0 ? 0 : data[data.length - 1][1]);
使用二分搜索,您可以找到删除的孔(移位的数字)。
无序。保留删除的数量。
保持BitSet
位的无限data.length
。
或者是带有删除的Set<Integer>
。当集合变得太大时重新编号。 (一组范围从-ID到ID也会更好。)
答案 4 :(得分:0)
如果你在临时存储中对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.