在不使用集合的情况下从java列表中删除重复项

时间:2014-07-21 10:14:57

标签: java list duplicate-removal

Java初学者,所以请忍受可能有些愚蠢的问题。

我有一个包含多个重复项的字符串列表,我想检测并删除这些重复项。我知道使用HashSet有一种简单的方法可以做到这一点,我实际上已经让它像这样工作了。但最初我试图以另一种方式做到这一点,也很简单,其中有一些错误,我不明白它是什么。

给定一个包含一个副本的字符串数组,比如{“A”,“B”,“C”,“A”},我可以检测并替换副本(此处为“A”)。但是如果我有一个包含多个重复项的字符串数组,比如{“A”,“B”,“C”,“A”,“E”,“A”},那么我的方法“replaceDuplicate”中的循环出错了()”。

我需要帮助以了解以下代码中的问题所在:

public class TryTask_B2_Vector {

public static void main(String[] args) {

    // Create array of strings for all the 'Gars':
    String[] garList = new String[] {"A", "B", "C", "A", "E", "A"};


    // Display the original "ArrayList" of 'Gars':
    System.out.println("Original list of Gars: " + garList);
    System.out.println();

    bruteForce(garList);
    System.out.println(bruteForce(garList));
    System.out.println();

    replaceDuplicate(garList);
    System.out.println();

    bruteForce(garList);
    System.out.println(bruteForce(garList));
    System.out.println();

    System.out.println("New list of Gars: " + garList); 

}    


    public static boolean bruteForce(String[] input){

    for(int i=0; i < input.length; i++){
        for(int j=0; j < input.length; j++){
            if(input[i].equals(input[j]) && i != j){
                return true;
            }
        }
    }
    return false;
}


    public static String[] replaceDuplicate(String[] input){

        for(int i=0; i < input.length; i++){
            for(int j=0; j < input.length; j++){
                if(input[i].equals(input[j]) && i != j){
                    input[j] = input[j].replace(input[j], "null");
                    System.out.println(input[j]);
                }
            }
        }    
        return input;
    }        
}

4 个答案:

答案 0 :(得分:2)

该程序工作正常,它用String“null”替换重复项。因此{ "A", "B", "C", "A", "E", "A" }的输出为[A, B, C, null, E, null]。打印输出语句中有两个令人困惑的位。一个第二个bruteForce()方法仍然返回true,表示仍然存在重复。实际上,这个重复的值是字符串“null”。其次是多个空打印输出。在replaceDuplicate()中,您首先将值设置为“null”,然后执行始终打印为null的打印。

另一点。 j的内部循环不需要从0开始。我们只需要查看重复项的内容。所以它可以从(i + 1)for (int j = i+1; j < input.length; j++)开始。保存一些额外的循环,你可以避免i != j检查。

修改你的程序,如

import java.util.Arrays;

public class TryTask_B2_Vector {

    public static void main(String[] args) {

        // Create array of strings for all the 'Gars':
        String[] garList = new String[] { "A", "B", "C", "A", "E", "A" };

        // Display the original "ArrayList" of 'Gars':
        System.out.println("Original list of Gars: " + Arrays.toString(garList));
        System.out.println();

        bruteForce(garList);
        System.out.println("Has duplicates : " + bruteForce(garList));
        System.out.println();

        replaceDuplicate(garList);
        System.out.println();

        bruteForce(garList);
        System.out.println("Has duplicates : " + bruteForce(garList));
        System.out.println();

        System.out.println("New list of Gars: " + Arrays.toString(garList));

    }

    public static boolean bruteForce(String[] input) {

        for (int i = 0; i < input.length; i++) {
            for (int j = i+1; j < input.length; j++) {
                if (!"null".equals(input[i]) && input[i].equals(input[j])) {
                    return true;
                }
            }
        }
        return false;
    }

    public static String[] replaceDuplicate(String[] input) {

        for (int i = 0; i < input.length; i++) {
            for (int j = i+1; j < input.length; j++) {
                if (!"null".equals(input[i]) && input[i].equals(input[j])) {
                    System.out.println("Duplicate found : " + input[j]);
                    input[j] = input[j].replace(input[j], "null");
                }
            }
        }
        return input;
    }
}

答案 1 :(得分:1)

问题出在您的bruteforce方法中。在删除所有重复项后,您希望它返回false,但事实并非如此。您的replace method工作正常,并将字符串null放在重复项A出现的位置。它会放入多个String null(每个额外一个&#39; A&#39;),因此您的暴力方法仍然会看到重复项并仍然返回true。只需添加

if(!input[i].equals("null"))

对你的暴力方法而言应该没问题

答案 2 :(得分:1)

可能需要进行一些修改,但是:

@Test
public void test(){
    String[] garList = new String[] {"A", "B", "C", "A", "E", "A"};

    //remove duplicates 
    String[] noDup = new String[garList.length];
    for(int i =0; i<garList.length; i++){
        if(!contains(noDup, garList[i])){
            noDup[i] = garList[i];
        }
    }
    System.out.println(Arrays.toString(noDup));
    // move nulls to the end
    String[] tailNull = new String[garList.length];
    int j = 0;
    for (int i = 0; i < noDup.length; i++) {
        if(noDup[i]!=null){
            tailNull[j] = noDup[i];
            j++;
        }
    }
    System.out.println(Arrays.toString(tailNull) + "/" + j);
    // copy range of not null elements 
    String[] noNull = new String[j];
    System.arraycopy(tailNull, 0, noNull, 0, j);
    System.out.println(Arrays.toString(noNull));
}

boolean contains(String[] array, String o){
    for (int i = 0; i < array.length; i++) {
        if(o.equals(array[i]))
            return true;
    }
    return false;
}

删除重复项和重复的空值。

答案 3 :(得分:0)

通过使用2种方法,我们可以从java..i.e中的列表对象中删除重复的元素 1.通过使用每个 2.使用迭代器 恩。每个使用

ArrayList<String> wordDulicate = new ArrayList<String>();
ArrayList<String> tempList= new ArrayList<String>();

wordDulicate.add("Tom");
wordDulicate.add("Jones");
wordDulicate.add("Sam");


for (String dupWord : wordDulicate) {
    if (!tempList.contains(dupWord)) {
        tempList.add(dupWord);
    }
}

2。通过使用迭代器

ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();

Iterator iterator = l1.iterator();

    while (iterator.hasNext())
    {
        YourClass o = (YourClass) iterador.next();
        if(!l2.contains(o)) l2.add(o);
    }
如果你喜欢这个答案就会打... ...