2016-02-28 13 views
0

我有一個字符串列表,像下面:建議對列表中的數值總結

"AB", "XY", 10 
"CD", "XY", 15 
"CD", "XY", 12 
"AB", "XY", 19 

我想要做的就是在最後一個值來總結號碼爲第一值,並把該在一個新的列表中。

所以這會給我:

"AB", "XY", 29 
"CD", "XY", 27 

我是新來的Java,所以我仍然與語法和不同的方法掙扎。我查看了compareTo()和equals()方法,但嘆了口氣。可以使用一些幫助。

+0

如果您使用Java 8,則可以使用流和'groupingBy',例如看到http://www.leveluplunch.com/java/examples/java-util-stream-groupingBy-example/ – Andreas

回答

3

第一個問題是:你爲什麼有作爲字符串列表?看起來你有一個包含3個屬性的對象列表:2個字符串和一個整數。擁有這樣的數據結構將使代碼更易於讀寫。

現在,爲了解決這個問題,首先需要做的地圖,將持有的字符串的第一部分和數字的總和:

  1. 使用流API,地圖是由創建使用Collectors.groupingBy收集器將每個字符串分類到字符串的第一部分,即最後一個逗號前的所有字符串。然後,對於歸入同一個關鍵字的所有值,我們使用Collectors.summingInt來計算最後一個逗號之後的數字。
  2. 當我們有一個地圖,我們就可以遍歷所有條目,每個條目轉換回String終於收集到一個列表與Collectors.toList()

示例代碼:

public static void main(String[] args) { 
    List<String> list = Arrays.asList("\"AB\", \"XY\", 10", "\"CD\", \"XY\", 15", "\"CD\", \"XY\", 12", "\"AB\", \"XY\", 19"); 

    Map<String, Integer> map = 
     list.stream() 
      .collect(Collectors.groupingBy(
       s -> s.substring(0, s.lastIndexOf(',')), 
       Collectors.summingInt(s -> Integer.parseInt(s.substring(s.lastIndexOf(',') + 2))) 
      )); 
    List<String> result = 
     map.entrySet() 
      .stream() 
      .map(e -> e.getKey() + ", " + e.getValue()) 
      .collect(Collectors.toList()); 

    System.out.println(result); 
} 
+1

感謝這個工作部分。我正在閱讀你現在提到的API。我有點接近,但我認爲它現在將第一個和第二個價值作爲關鍵,總結了這些價值。我將如何使用此方法完全忽略第二個值,並僅將第一個值作爲關鍵字並總結第一個字符串值的所有內容? 因此,它看起來像: 「AB」,29 「CD」,27 編輯:沒關係了它。謝謝! –

0

輸入數據:

"AB", "XY", 10 
"CD", "XY", 15 
"CD", "XY", 12 
"AB", "XY", 19 
"AB", "XY", 3 

代碼:

String inputData = "\"AB\", \"XY\", 10\n\"CD\", \"XY\", 15\n\"CD\", \"XY\", 12\n\"AB\", \"XY\", 19\n\"AB\", \"XY\", 3"; 

final String[] lines = inputData.split("\\n"); 

Map<String,Integer> results = new HashMap<>(); 

final Pattern compiledPattern = Pattern.compile("([\\\"A-Z,\\s]+),\\s(\\d+)"); 

for (String line : lines) { 
    final Matcher matcher = compiledPattern.matcher(line); 

    if (matcher.matches()) { 
     final String groupName = matcher.group(1); 
     final int value = Integer.valueOf(matcher.group(2)); 

     if (results.containsKey(groupName)) { 
      final Integer currentValue = results.get(groupName); 

      results.put(groupName, (currentValue+value)); 
    } else { 
     results.put(groupName, value); 
    } 
} 

輸出爲我的數據:

"CD", "XY" > 27 
"AB", "XY" > 32