删除String数组中的重复字符

时间:2017-07-18 17:39:59

标签: java arrays algorithm array-algorithms

我有一个像[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

4 个答案:

答案 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] + " ");
}