2016-03-21 34 views
4

我有一個文件夾中的所有文件名以及已由開發人員手動「檢查」的文件列表的列表。我將如何去比較這兩個數組,以便僅打印那些未包含在主列表中的數組。比較兩個String []數組並打印出不同的字符串

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

回答

6

更改你的循環到:

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應該是的外面循環。否則ar將在list中每次存在checked數組的元素時創建。

編輯:

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

有了這個說法,你正在檢查的checked引用是不是list的元素。應該是checked[i]來檢查list中是否存在checked的元素。

如果要打印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); 
+0

謝謝,但打印時出現編譯錯誤。看到我更新的問題。 – santafebound

+0

只需使用'System.out.println(ar)'打印'ar'。內部'toString()'將在'ar'上被調用。 – Satya

+0

謝謝,你可以在這裏看到它:http://ideone.com/AigDCH。似乎沒有打印出任何東西。 – santafebound

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,則必須替換Streams和過濾器的用法,並使用Java 7中的相應功能(請參閱Satya的文章)進行收集。

不管怎麼說,我要指出,有更好的(關於性能)實現,以解決您的問題,例如,

  • 你可以尋找重複之前的列表進行排序,
  • 你可以使用,例如, ,基於散列的實現,以提高速度重複搜索時,
  • 你可以移動代碼內環以外,
  • ,還有更多
1

您的更新解決方案對我來說似乎有些奇怪,不知道爲什麼要將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); 
相關問題