我有一个像[q w e r r t]这样的示例输入,我想删除重复项并使用数组打印[q w e r t]。我不明白为什么以下代码段的输出不同。
for(int j=0; j< array.length; j++) {
for(int k=j+1; k< array.length; k++) {
if(array[j] == array[k]) {
continue;
}
System.out.print(array[j] + " ");
j = k;
}
}
更新:我想将此逻辑用于已排序的数组。我使用了Arrays.sort()。我为字符串更改了== to .equals()。
public static void main(String args[]) throws IOException {
// Enter size of array and assert the type of input
System.out.println("Enter size of array in integers");
Scanner sc = new Scanner(System.in);
while (!sc.hasNextInt()) {
System.out.println("Please enter integers");
sc.next();
}
;
// Accepting the values into the array and sorting them
int demoInt = sc.nextInt();
String[] array = new String[demoInt];
String[] outputMarkers = new String[demoInt];
System.out.println("Enter the values");
for (int i = 0; i < array.length; i++) {
Scanner scNum = new Scanner(System.in);
array[i] = scNum.next();
if (i == array.length - 1) System.out.println("Array is full");
}
Arrays.sort(array);
System.out.printf("Sorted array is : %s", Arrays.toString(array));
//Checking for duplicates //Sample: a a a s d f
for (int j = 0; j < array.length; j++) {
for (int k = j + 1; k < array.length; k++) {
if (array[j].equals(array[k])) {
continue; //returns to for loop with increment
}
System.out.print(array[j] + ". ");
j = k;
}
}
}
输入:a a a d f 输出:a d f
答案 0 :(得分:0)
如果您要删除值而不是在打印时跳过它们,您将需要从数组的末尾开始并朝0方向工作,在找到匹配的对象时调用array.remove(i)以前检查过的对象。
虽然这只是为了循环练习。将数组推送到Set中会更容易。
答案 1 :(得分:0)
您的问题是您正在检查每个字符后面的所有字符。想象一个没有重复的数组;一旦你到达最后一个角色,你就会打印掉所有角色。但是当j = array.length - 1
,然后k = array.length
和第二个for
循环根本不运行时,您的最后一个字符将永远不会被打印。
您的代码始终无法正确打印最后一个元素。唯一正确的情况是,你的最后一个元素是前一个元素的副本,而不是倒数第二个元素。
请尝试使用此代码:
outerloop:
for (int j = 0; j < array.length; j++) {
for(int k = 0; k < j; k++) {
if(array[j] == array[k]) {
continue outerloop;
}
}
System.out.print(array[j] + " ");
}
代码的前提是它遍历每个字符。如果它匹配任何前面的字符,代码将跳过该元素并继续下一个元素。
编辑:看起来您编辑了排序数组的问题。这意味着如果最后一个元素是重复的,那么它将是之前元素的副本,因此我们不必担心我之前的代码块中的角落情况。
for(int j=0; j< array.length; j++) {
for(int k=j+1; k< array.length; k++) {
if(array[j] == array[k]) {
continue;
}
System.out.print(array[j] + " ");
j = k;
}
}
System.out.print(array[array.length-1] + " ");
答案 2 :(得分:0)
您可以使用大小为122的布尔数组,将数组中的所有值设为false,迭代给定字符数组,如果字符的ASCII值为false,则将其设为true并打印出来。 下面是示例代码,这里我已经取了一个字符串并删除所有重复项并打印结果字符串:
>>> l=[1,5,7,7,8,1]
>>> myfunc(l)
[1, 7]
>>> l=[3,1,4,1,5]
>>> myfunc(l)
[1, 4]
完整的代码位于
Removing Duplicate Characters From String Without Using Set | jain Tarun Blog
答案 3 :(得分:-1)
为什么不只使用一个循环?
//assuming array has length >= 2
System.out.print(array[0] + " ");
for(int j=1; j< array.length; j++) {
if(array[j] == array[j - 1]) {
continue;
}
System.out.print(array[j] + " ");
}