【问题标题】:Compare two String[] arrays and print out the strings which differ比较两个 String[] 数组并打印出不同的字符串
【发布时间】:2018-05-03 20:12:43
【问题描述】:

我有一个文件夹中所有文件名的列表以及开发人员手动“检查”的文件列表。我将如何比较这两个数组,以便我们只打印出主列表中不包含的那些。

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

【问题讨论】:

  • 如果我正确理解了这个问题,我会使用嵌套循环并将未包含在新数组中的名称存储起来。

标签: java arrays


【解决方案1】:

将循环更改为:

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的元素是否存在于list中,应该是checked[i]。

如果您想打印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);

【讨论】:

  • 谢谢,但打印时出现编译错误。请参阅我更新的问题。
  • 只需使用System.out.println(ar) 打印ar。在内部 toString() 将在 ar 上调用。
  • 谢谢,你可以在这里看到它:ideone.com/AigDCH。似乎没有打印出任何东西。
  • 因为checked的所有元素都存在于list中。首先检查一下。
  • 啊,我明白了。但我想打印出不存在的元素。我想我解决了。请参阅我的更新答案。
【解决方案2】:

您更新的解决方案对我来说似乎有点奇怪,不知道为什么要将 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);

【讨论】:

    【解决方案3】:
    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
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      • 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 和过滤器的使用并收集(参见例如 Satya 的帖子)。

      无论如何,我应该提到有更好的(关于性能)实现来解决您的问题,例如,

      • 您可以在搜索重复项之前对列表进行排序,
      • 您可以使用例如基于哈希的实现来提高搜索重复项时的速度,
      • 您可以将代码移到内部循环之外,
      • 还有更多

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-17
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多