2017-05-17 27 views
1

我有一個ArrayList從通過目錄JAVA - 在具有共同字符串的ArrayList中計數成員?

[project1_john_document1, project1_john_document2, project2_jose_document1, project2_jose_document2, project3_juan_document1, ...... ] 

我試圖計算實例爲每個項目得到如下輸出

project1 = 3, 
project2 = 2, 
project3 = 1, .... 

我所做的就是通過重述遞歸爬行列表,但不知何故,我堅持如何將「project1」作爲一個通用項目,因爲目錄上有許多項目名稱。我嘗試使用split(「_」)分割字符串,但由於我完全是noob,因此無法獲得對不同項目名稱進行分類的邏輯。

在java新手在這裏,抱歉我的問題含糊不清的措辭。

+2

如果您要向我們展示您的代碼,我們可以告訴它有什麼問題。 –

+0

看看正則表達式,如果你想在你的數組中找到那個模式,並且匹配發生時,請對它進行計數。 https://www.tutorialspoint.com/java/java_regular_expressions.htm –

回答

1

您可以使用正則表達式來獲取所有的項目名稱,則可以使用例如地圖:

String str = "[project1_john_document1, project1_john_document2, project2_jose_document1, project2_jose_document2, project3_juan_document1]"; 
Pattern p = Pattern.compile("project\\d+"); 
Matcher m = p.matcher(str); 
Map<String, Integer> map = new HashMap<>(); 
String project; 
while (m.find()) { 
    project = m.group(); 
    if (map.containsKey(project)) { 
     map.put(project , map.get(project) + 1); 
    } else { 
     map.put(project , 1); 
    } 
} 
for (Map.Entry<String, Integer> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + "\t" + entry.getValue()); 
} 

輸出

project2 2 
project1 2 
project3 1 

regex demo

+0

謝謝!這工作! –

+0

歡迎您@JohnMedina –

1

如果模式很簡單 - projectNumber之前「_」這一項做好這項工作:如果你想了解有多少project1project2等文件夾計數

Map<String, Long> projectNumbers = Arrays.asList("project1_john_document1", "project1_john_document2", "project2_jose_document1", "project2_jose_document2", "project3_juan_document1") 
       .stream().map(s -> s.split("_")[0]) 
       .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); 
1

你有,你可以用下面的代碼實現它:

String[] names = {"project1_john_document1", "project1_john_document2", "project2_jose_document1", "project2_jose_document2", "project3_juan_document1"}; 
    Map<String, Integer> counts = new HashMap<>(); 
    for (String entry : names) { 
     String project = entry.split("_")[0]; 
     int count = counts.containsKey(project) ? counts.get(project) : 0; 
     counts.put(project, count + 1); 
    } 

    System.out.println(counts); 
    // prints: {project2=2, project1=2, project3=1} 

至於提到的其他答案,你可以使用正則表達式,溪流等做類似的事情。但基本邏輯是相同的:對於每個文件夾,獲取根名稱,在地圖中增加計數器。如果你是初學者,我可能會首先考慮最基本的流程,然後再深入到更復雜的東西(例如流)中。

1

定義要進行比較的字符串名稱轉換成更簡單的自定義函數,然後收集

List<String> myL = Arrays.asList("project1_john_document1", "project1_john_document2", 
      "project2_jose_document1", "project2_jose_document2", "project3_juan_document1"); 
Function<String, String> myFRegex = t -> { 
     return t.substring(0, t.indexOf("_")); 
    }; 
Map<String, Long> primeFactorCount = myL.stream() 
      .collect(Collectors.groupingBy(myFRegex, Collectors.counting())); 
System.out.println(primeFactorCount); 

輸出可以看起來像:

{項目2 = 2,PROJECT1 = 2,project3 = 1}

相關問題