我有一個字符串列表,像下面:建議對列表中的數值總結
"AB", "XY", 10
"CD", "XY", 15
"CD", "XY", 12
"AB", "XY", 19
我想要做的就是在最後一個值來總結號碼爲第一值,並把該在一個新的列表中。
所以這會給我:
"AB", "XY", 29
"CD", "XY", 27
我是新來的Java,所以我仍然與語法和不同的方法掙扎。我查看了compareTo()和equals()方法,但嘆了口氣。可以使用一些幫助。
我有一個字符串列表,像下面:建議對列表中的數值總結
"AB", "XY", 10
"CD", "XY", 15
"CD", "XY", 12
"AB", "XY", 19
我想要做的就是在最後一個值來總結號碼爲第一值,並把該在一個新的列表中。
所以這會給我:
"AB", "XY", 29
"CD", "XY", 27
我是新來的Java,所以我仍然與語法和不同的方法掙扎。我查看了compareTo()和equals()方法,但嘆了口氣。可以使用一些幫助。
第一個問題是:你爲什麼有作爲字符串列表?看起來你有一個包含3個屬性的對象列表:2個字符串和一個整數。擁有這樣的數據結構將使代碼更易於讀寫。
現在,爲了解決這個問題,首先需要做的地圖,將持有的字符串的第一部分和數字的總和:
Collectors.groupingBy
收集器將每個字符串分類到字符串的第一部分,即最後一個逗號前的所有字符串。然後,對於歸入同一個關鍵字的所有值,我們使用Collectors.summingInt
來計算最後一個逗號之後的數字。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);
}
感謝這個工作部分。我正在閱讀你現在提到的API。我有點接近,但我認爲它現在將第一個和第二個價值作爲關鍵,總結了這些價值。我將如何使用此方法完全忽略第二個值,並僅將第一個值作爲關鍵字並總結第一個字符串值的所有內容? 因此,它看起來像: 「AB」,29 「CD」,27 編輯:沒關係了它。謝謝! –
輸入數據:
"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
如果您使用Java 8,則可以使用流和'groupingBy',例如看到http://www.leveluplunch.com/java/examples/java-util-stream-groupingBy-example/ – Andreas