【问题标题】:Is there a algorithm to remove some element that is the same as another?有没有一种算法可以删除一些与另一个相同的元素?
【发布时间】:2020-05-19 20:09:40
【问题描述】:

我想删除 一些输出 与另一个输出具有相同的值! 由于 Test1 = Test2 = Test5 = Test6 ,所以我希望它在控制台上只显示 Test1 ! Test3 =Test4 =Test7 = Test8,所以我希望它只显示Test3! ........

以下代码是我所做的:

    boolean flg1 = true;
    List<List<String>> tmp1 = new ArrayList <>();
    List<List<String>> tmp2 = new ArrayList <>();
    System.out.println();
    System.out.println("Size of the subset: " + subset.size());
    for(int i=0; i< subset.size();i++){
        tmp1=subset.get(i);

        // System.out.println("TMP1:"+ tmp1);

        for(int j=0; j<subset.size();j++){
        tmp2=subset.get(j);

        // System.out.println("TMP2:"+ tmp2.get(1));

            if(i != j && !compareOuterlist(tmp1,tmp2)){
                flg1=true;
                continue;
            }
        }
        if(flg1){
            count++;
            System.out.println("TEST " + (i+1) + ":"+ tmp1);
        }
    }

    System.out.println();
    System.out.println("Total partition:"+ count);
}
public static boolean compareOuterlist(List<List<String>> p1, List<List<String>> p2){
    if(p1.size() != p2.size()){
        return false;
    }
    for(int i = 0;i < p1.size();i++){
        if(!(compareInnerlist1(p1.get(i),p2.get(i)))){
            return false;
        }
    }
    return true;
}

public static boolean compareInnerlist1(List<String> p1, List<String> p2){
    for(int i=0;i<p1.size();i++){
        if(!(p1.equals(p2))){
            return false;
        }
    }
    return true;
}

以下是我的输出:

TEST 1:[[P11, X11, X22], [P11, X11, X22]]
TEST 2:[[P11, X11, X22], [P11, X11, X22]]
TEST 3:[[X11, X22], [P11, X22], [P11, X11]]
TEST 4:[[X11, X22], [P11, X22], [P11, X11]]
TEST 5:[[P11, X11, X22], [P11, X11, X22]]
TEST 6:[[P11, X11, X22], [P11, X11, X22]]
TEST 7:[[X11, X22], [P11, X22], [P11, X11]]
TEST 8:[[X11, X22], [P11, X22], [P11, X11]]
TEST 9:[[P11, X22], [X11, X22], [P11, X11]]
TEST 10:[[P11, X22], [X11, X22], [P11, X11]]
TEST 11:[[P11, X22], [X11, X22], [P11, X11]]
TEST 12:[[P11, X22], [X11, X22], [P11, X11]]

【问题讨论】:

  • 您在寻找 Set 吗? java中搜索HashSet、TreeSet
  • 你可以看看我建议的算法

标签: java list algorithm


【解决方案1】:

使用 Java 8 Streams,您可以使用 distinct()

List<List<List<String>>> result = subset.stream().distinct().collect(Collectors.toList());

如果您想在打印时循环执行,可以使用Set

Set<List<List<String>>> distinct = new HashSet<>();
for (int i = 0; i < subset.size(); i++) {
    List<List<String>> tmp1 = subset.get(i);
    if (distinct.add(tmp1))
        System.out.println("TEST " + (i+1) + ":"+ tmp1);
}
System.out.println();
System.out.println("Total partition: " + distinct.size());

输出

TEST 1:[[P11, X11, X22], [P11, X11, X22]]
TEST 3:[[X11, X22], [P11, X22], [P11, X11]]
TEST 9:[[P11, X22], [X11, X22], [P11, X11]]

Total partition: 3

【讨论】:

  • 谢谢!你的回答对我很有帮助!!
  • 对不起!我刚刚发现 TEST 3 和 TEST 9 具有相同的元素,但是元素的定位顺序不同!。那么,有什么办法可以删除 TEST 9?
  • @Insider 他们是列表。列表是有序的,所以[A,B] 不同于[B,A]。如果您想更改要求,那么这是一个新问题,因此请创建一个新问题并确保列出所有规则。这个问题已经回答了。
【解决方案2】:

您可以在想要打印测试时创建一个 String 的 ArrayList ,然后将结果添加到该 List ,但在打印和递增 count 之前,您必须确保要打印的内容不存在于列表:

if(flg1){
        if !(Your_List.conatains("TEST " + (i+1) + ":"+ tmp1)) {
             System.out.println("TEST " + (i+1) + ":"+ tmp1);
             count++;
        }
        Your_List.add("TEST " + (i+1) + ":"+ tmp1);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多