首先让我说这是一个我遇到麻烦的作业问题。
我已经对一个数组进行了排序,我需要做的是使用另一个数组来删除重复数据,方法是迭代第一个并比较相邻的项,然后将非重复项添加到新数组中。完成后我将旧数组设置为新数组。我不习惯java,因此我遇到了一些问题,我认为正确地进行迭代设置。
public static void main(String[] args) {
args = new String[] { "data/list1.txt" };
StdIn.fromFile("data/list2.txt");
// StdOut.toFile ("finished.txt");
int[] whitelist = In.readInts(args[0]);
Arrays.sort(whitelist);
int newArray[] = new int[whitelist.length];
for (int i = 0; i < whitelist.length-1; i++) {
int k = 0;
if(whitelist[i+1] > whitelist[i])
newArray[k] = whitelist[i];
k++;
StdOut.println(java.util.Arrays.toString(whitelist));
whitelist = newArray;
}
for (int i=0; i<newArray.length;i++){
StdOut.println(java.util.Arrays.toString(newArray));
}
此代码片段是更大的二进制搜索的一部分,但这是我遇到问题的部分。
除了没有删除重复项之外,我的输出也打印了几次。
任何方向都会受到高度赞赏。
答案 0 :(得分:1)
由于不使用集合等限制,您的代码可以通过这种方式重写,并且可以正常工作:
Arrays.sort(whitelist);
int newArray[] = new int[whitelist.length];
newArray[0] = whitelist[0];
int k = 1;
for (int i = 0; i < whitelist.length - 1; i++) {
if(whitelist[i+1] > whitelist[i]) {
newArray[k] = whitelist[i + 1];
k++;
}
}
newArray = Arrays.copyOf(newArray, k);
whitelist = newArray;
System.out.println(Arrays.toString(newArray));
答案 1 :(得分:0)
if
仅适用于第一条指令,k ++在每次迭代中递增。你应该使用:
if (whitelist[i+1] > whitelist[i]) {
newArray[k] = whitelist[i];
k++;
}
此外,在第一个循环中,即使在第一个操作之后,您仍然用whilelist
覆盖newArray
,我认为您打算将其移到for
之外:
StdOut.println(java.util.Arrays.toString(whitelist));
whitelist = newArray;
答案 2 :(得分:0)
它可以通过在纸上概述算法来帮助您开始任何工作,当您必须编写面试代码时,这将有所帮助。
答案 3 :(得分:0)
一般来说,您应该正确定义equals()和hashCode(),以定义“复制”一词对您的对象的含义。但是既然你使用原语和包装器(通过装箱/拆箱),你就不必在这里做。
然后你应该将你的数组放入一些Set集合中。所有重复项将自动消除。之后将Set设置回Array。
Java内置机制将以最优化的方式删除重复项。 您不必手动完成。
Integer[] whitelistI = null;
Set set = new HashSet(Arrays.asList(whitelist));
whitelistI = (Integer []) set.toArray(new Integer[set.size()]);
如果您需要一组基元,可以从whitelistI复制它。
而且,这是错误的:
int newArray[] = new int[whitelist.length];
您的新数组与原始数组的长度相同,但您说要删除重复项。 如果删除重复项,其实际大小会变短,新数组将具有空值(在您的情况下为0(零))。