gpt4 book ai didi

java - 将数据按组存储到 map 中

转载 作者:行者123 更新时间:2023-11-30 06:52:01 25 4
gpt4 key购买 nike

例如,我有一个字符串:

2014@2@200@0#2014@2@200@0#2012@2@200@0#2012@2@200@0#2011@2@200@0

现在我需要将上述详细信息存储到一张具有以下规则的 map 中:

  1. 使用“#”分割上面的字符串
  2. 再次使用@分割子字符串
  3. 分割后将数据存储到 map 中

例如,如果我们使用 # 分割上面的字符串,那么我们可以将下面的数据放入字符串数组中:

array[0] = "2014@2@200@0";
array[1] = "2014@2@200@0";
array[2] = "2012@1@100@0";
array[3] = "2012@3@200@0";
array[4] = "2011@2@200@0";

现在再次使用“@”分割数组数据。

所以我们得到:

a[0] = "2014";
a[1] = "2";
a[2] = "200";
a[3] = "0";

map 看起来像:Map"String, TestClass"test;

TestClass {
String a1;
String a2;
String s3;
String a4;
}

map 键:a[0]值

我需要按 [0] 值对这些数据进行分组。

例如 2014 年关键 map 数据:

key : 2014
value : a4 = 2014, a1 = 2+2, a2 = 200 + 200, a3 = 0 + 0

key : 2012
value : a4 = 2012, a1 = 1+3, a2 = 100 + 200, a3 = 0 + 0

如何实现上述案例?

最佳答案

这是一个使用 Java 8 的简短解决方案:

TestSplit.java

import java.util.stream.Stream;

public class TestSplit {
public static void main (String... args) {
Map<String, TestClass> map = split("2014@2@200@0#2014@2@200@0#2012@1@100@0#2012@3@200@0#2011@2@200@0");
map.forEach((key, value) -> System.out.println(key + " -> " + value));
}

private static Map<String, TestClass> split(String input) {
String[] testClassStrings = input.split("#");
Stream<String[]> testClassStringsStream = Arrays.stream(testClassStrings).map(s -> s.split("@"));
Stream<TestClass> testClasses = testClassStringsStream.map(s -> new TestClass(s[0], s[1], s[2], s[3]));
Map<String, TestClass> testClassesMap = new HashMap<>();
testClasses.forEach((TestClass tc) -> {
TestClass oldValue = testClassesMap.get(tc.a0);
testClassesMap.put(tc.a0, oldValue == null ? tc : new TestClass(oldValue, tc));
});

return testClassesMap;
}
}

TestClass.java

class TestClass {
String a0;
String a1;
String a2;
String a3;

public TestClass(String a0, String a1, String a2, String a3) {
this.a0 = a0;
this.a1 = a1;
this.a2 = a2;
this.a3 = a3;
}

public TestClass(TestClass tc1, TestClass tc2) {
this.a0 = tc1.a0;
this.a1 = tc1.a1 + " + " + tc2.a1;
this.a2 = tc1.a2 + " + " + tc2.a2;
this.a3 = tc1.a3 + " + " + tc2.a3;
}

@Override
public String toString() {
return String.format("a0 = %s, a1 = %s, a3 = %s, a4 = %s", a0, a1, a2, a3);
}
}

您所需要做的就是调用split TestSplit中的方法类(class)。该方法应该简洁且易读,但只要付出更多努力,您就可以使其更加实用。具体步骤如下:

  1. 使用#分割字符串(行 String[] testClassStrings = input.split("#"); )。这将执行以下转换:"2014@2@200@0#2014@2@200@0#2012@1@100@0#2012@3@200@0#2011@2@200@0"

    testClassStrings[0] = "2014@2@200@0"
    testClassStrings[1] = "2014@2@200@0"
    testClassStrings[2] = "2012@1@100@0"
    testClassStrings[3] = "2012@3@200@0"
    testClassStrings[4] = "2011@2@200@0"
  2. 使用@分割每个字符串。 (行 Stream<String[]> testClassStringsStream = Arrays.stream(testClassStrings).map(s -> s.split("@")); 。现在您有一个流,其中每个条目都是类似 ["2014", "2", "200", "0"] 的数组。

  3. 从每个字符串构建一个新的 TestClass线路 Stream<TestClass> testClasses = testClassStringsStream.map(s -> new TestClass(s[0], s[1], s[2], s[3])); .

  4. 迭代所有测试类并将它们添加到映射中testClassesMap 。如果映射中已包含某个测试类,请添加其元素:

    Map<String, TestClass> testClassesMap = new HashMap<>();
    testClasses.forEach((TestClass tc) -> {
    TestClass oldValue = testClassesMap.get(tc.a0);
    testClassesMap.put(tc.a0, oldValue == null ? tc : new TestClass(oldValue, tc));
    });

运行TestSplit中的main方法将产生:

2014 -> a0 = 2014, a1 = 2 + 2, a3 = 200 + 200, a4 = 0 + 0
2012 -> a0 = 2012, a1 = 1 + 3, a3 = 100 + 200, a4 = 0 + 0
2011 -> a0 = 2011, a1 = 2, a3 = 200, a4 = 0

关于java - 将数据按组存储到 map 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42561762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com