繁体   English   中英

从Java列表中删除重复项而不使用集合

[英]Remove duplicates from java list without using sets

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;
    }        
}

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

还有一点。 j的内部循环不必从0开始。我们只需要在ahaead中查找重复项即可。 因此for (int j = i+1; j < input.length; j++)它可以从(i + 1)开始。 节省了一些额外的循环,您可以避免执行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;
    }
}

问题出在您的bruteforce方法中。 删除所有重复项后,您期望它返回false ,但事实并非如此。 您的replace method可以正常工作,并将String null出现在重复项A出现的地方。 它要放入多个String null (每个额外的'A'一个),因此,您的bruteforce方法仍然会看到重复项并仍然返回true 只需添加

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

对于您的蛮力方法,应该没问题

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

@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;
}

删除重复项和重复的null。

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

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);
    }

就像你喜欢答案一样打...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM