比较两个字符串数组并打印出不同的字符串

4
我有一个文件夹中所有文件名的列表,以及开发人员手动“检查”的文件列表。如何比较这两个数组,以便我们仅打印不包含在主列表中的那些文件。
我有一个文件夹中所有文件名的列表,以及开发人员手动“检查”的文件列表。如何比较这两个数组,以便我们仅打印不包含在主列表中的那些文件。
public static void main(String[] args) throws java.lang.Exception {
        String[] list = {"my_purchases", "my_reservation_history", "my_reservations", "my_sales", "my_wallet", "notifications", "order_confirmation", "payment", "payment_methods", "pricing", "privacy", "privacy_policy", "profile_menu", "ratings", "register", "reviews", "search_listings", "search_listings_forms", "submit_listing", "submit_listing_forms", "terms_of_service", "transaction_history", "trust_verification", "unsubscribe", "user", "verify_email", "verify_shipping", "404", "account_menu", "auth", "base", "dashboard_base", "dashboard_menu", "fiveohthree", "footer", "header", "header_menu", "listings_menu", "main_searchbar", "primary_navbar"};
        String[] checked = {"404", "account_menu", "auth", "base", "dashboard_base", "dashboard_menu", "fiveohthree", "footer", "header", "header_menu", "listings_menu"};

        ArrayList<String> ar = new ArrayList<String>();

            for(int i = 0; i < checked.length; i++)
                {
                    if(!Arrays.asList(list).contains(checked[i]))
                    ar.add(checked[i]);
                }
    }

1
如果我理解问题的意思正确,我会使用嵌套循环,并将不包含在新数组中的名称存储起来。 - Logan
4个回答

7

将您的循环改为:

ArrayList<String> ar = new ArrayList<String>();

for(int i = 0; i < checked.length; i++) {
      if(!Arrays.asList(list).contains(checked[i]))
      ar.add(checked[i]);
}

ArrayList ar 应该放在for循环外面。否则,每当checked数组中的元素存在于list中时,ar就会被创建。

编辑:

if(!Arrays.asList(list).contains(checked))

这条语句是在检查checked引用是否为list中的元素。应该使用checked[i]来检查checked中的元素是否存在于list中。

如果您想打印list中不在checked中的元素。则使用:

for(int i = 0; i < list.length; i++) {
      if(!Arrays.asList(checked).contains(list[i]))
      ar.add(list[i]);
}
System.out.println(ar);

谢谢,但是我在打印时遇到了编译错误。请查看我的更新问题。 - Martin Erlic
谢谢,您可以在这里查看:http://ideone.com/AigDCH。似乎没有打印任何内容。 - Martin Erlic
因为checked的所有元素都存在于list中。首先要检查这一点。 - SatyaTNV
啊,我明白了。但是我想打印出不存在的元素。我想我解决了它。请看我的更新答案。 - Martin Erlic
你想要什么?你想打印 list 中不存在于 checked 中的元素吗? - SatyaTNV
显示剩余3条评论

3

我觉得你更新后的解决方案有点奇怪,不确定为什么要将list [i]添加到结果列表中。通常情况下,这似乎是哈希集合的应用场景:

String[] list = { "my_purchases", "my_reservation_history","my_reservations","my_sales", "my_wallet", "notifications", "order_confirmation", "payment", "payment_methods", "pricing", "privacy", "privacy_policy", "profile_menu", "ratings", "register", "reviews", "search_listings", "search_listings_forms", "submit_listing", "submit_listing_forms", "terms_of_service", "transaction_history", "trust_verification", "unsubscribe", "user", "verify_email", "verify_shipping", "404", "account_menu", "auth", "base", "dashboard_base", "dashboard_menu", "fiveohthree", "footer", "header", "header_menu", "listings_menu", "main_searchbar", "primary_navbar"};
String[] checked = { "404", "account_menu", "auth", "base", "dashboard_base", "dashboard_menu", "fiveohthree", "footer", "header", "header_menu", "listings_menu"};

HashSet<String> s1 = new HashSet<String>(Arrays.asList(checked));
s1.removeAll(Arrays.asList(list));
System.out.println(s1);

1
for (String s: checked) {      // go through all in second list
    if (! list.contains(s)) {  // if string not in master list
        System.out.println(s); // print that string
    }
}

1

首先,我认为你的代码存在一些错误:

  • s1未定义
  • ar未定义
  • 你应该使用Arrays.toString而不是Array.toString

因此,我已经修复了你的代码(使用Java 8),它应该像这样工作:

public static void main(String[] args) throws java.lang.Exception {
    String[] list = {"my_purchases", "my_reservation_history", "my_reservations", "my_sales", "my_wallet", "notifications", "order_confirmation", "payment", "payment_methods", "pricing", "privacy", "privacy_policy", "profile_menu", "ratings", "register", "reviews", "search_listings", "search_listings_forms", "submit_listing", "submit_listing_forms", "terms_of_service", "transaction_history", "trust_verification", "unsubscribe", "user", "verify_email", "verify_shipping", "404", "account_menu", "auth", "base", "dashboard_base", "dashboard_menu", "fiveohthree", "footer", "header", "header_menu", "listings_menu", "main_searchbar", "primary_navbar"};
    String[] checked = {"404", "account_menu", "auth", "base", "dashboard_base", "dashboard_menu", "fiveohthree", "footer", "header", "header_menu", "listings_menu"};

    final List<String> result = Stream.of(list)
            .filter(listEntry -> Stream.of(checked)
                    .filter(checkedEntry -> checkedEntry.equals(listEntry)).findFirst().orElse(null) == null)
            .collect(Collectors.toList());

    System.out.println(result);
}

如果您不想使用Java 8,那么您需要用Java 7中相应的函数替换Streams、filters和collect的用法(例如,参见Satya的文章)。
无论如何,我应该提到,有更好的(性能方面)实现来解决您的问题,例如:
- 您可以在搜索重复项之前对列表进行排序, - 您可以使用基于哈希的实现来增加搜索重复项时的速度, - 您可以将代码移动到内部循环外, - 还有许多其他方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接