Map <string,list <string =“”>&gt;如果键与字符串相同,则在列表中添加值运行时间

时间:2017-07-19 10:25:53

标签: java collections

我有一个String,

String value = "Sunday  -  H15,Sunday  -  H03,Sunday  -  H13,Sunday  -  H01,Sunday  -  H05,Friday  -  H23,Saturday  -  H05,Monday  -  H16,Monday  -  H17,Monday  -  H18,Monday  -  H19,Monday  -  H20";

在这个字符串中我们有Days(星期日,星期一等等)和Alphanumneric(H15,H03等......)是小时。

现在我的要求是:

我想要一个Map<String, List<String>>,其中Key应该是Day,Value应该是同一天的小时列表。

例如:

Sunday : [H15,H03,H13,H01,H05]
Monday : [H16,H17,H18,H19,H20]
Friday : [H23]
Saturday : [H05]

方法

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DayPartProcessingTest {

    public static void main(String[] args) {

        String propertyValue = "Sunday  -  H15,Sunday  -  H03,Sunday  -  H13,Sunday  -  H01,Sunday  -  H05,Friday  -  H23,Saturday  -  H05,Monday  -  H16,Monday  -  H17,Monday  -  H18,Monday  -  H19,Monday  -  H20";

        Map<String, List<String>> map = new HashMap<String, List<String>>();

        String[] dayParts = propertyValue.split(",");

        for (String string : dayParts) {
            String[] array = string.split("  -  ");
            if (map.get(array[0]) == null) {
                List<String> list = new ArrayList<>();
                list.add(array[1]);
                map.put(array[0], list);
            } else {
                List<String> tempList = map.get(array[0]);
                tempList.add(array[1]);
                map.put(array[0], tempList);
            }
        }
        System.out.println(map);

    }

}

这是正常工作并且根据需要但是还有其他任何可行的方法。我想不出任何其他:(

4 个答案:

答案 0 :(得分:1)

试试这个。

String propertyValue = "Sunday  -  H15,Sunday  -  H03,Sunday  -  H13,Sunday  -  H01,Sunday  -  H05,Friday  -  H23,Saturday  -  H05,Monday  -  H16,Monday  -  H17,Monday  -  H18,Monday  -  H19,Monday  -  H20";
Map<String, List<String>> map = new HashMap<String, List<String>>();
String[] dayParts = propertyValue.split(",");
for (String string : dayParts) {
    String[] array = string.split("  -  ");
    map.computeIfAbsent(array[0], k -> new ArrayList<>()).add(array[1]);
}
System.out.println(map);

或者

String propertyValue = "Sunday  -  H15,Sunday  -  H03,Sunday  -  H13,Sunday  -  H01,Sunday  -  H05,Friday  -  H23,Saturday  -  H05,Monday  -  H16,Monday  -  H17,Monday  -  H18,Monday  -  H19,Monday  -  H20";
Map<String, List<String>> map = Arrays.stream(propertyValue.split(","))
    .map(e -> e.split("  -  "))
    .collect(Collectors.groupingBy(
        a -> a[0],
        Collectors.mapping(a -> a[1], Collectors.toList())));

答案 1 :(得分:1)

另一种解决方案是使用Java 8 Stream:

Arrays.stream(value.split(","))

,将为groupingBy分割的值创建流 Collectors.mapping收集器会按给定的密钥对您的信息流进行分组(在本例中为日期) Collectors.toList会转换您的地图值的值 然后this会将转换后的值收集到列表中。

答案 2 :(得分:0)

您的代码可以清理一下

containsKey(..)

我这里没有使用get(..) / while( $row = mysql_fetch_assoc( $result)){ $new_array[] = $row; // Inside while loop } 组合,因为在潜在的并发访问地图的情况下,可能存在竞争条件。

答案 3 :(得分:0)

您可以使用containsKey代替map.get(array[0]) == null。您还可以减少添加到地图时的操作数量

if (!map.containsKey(array[0])) {
    map.put(array[0], new ArrayList<String>());
}
map.get(array[0]).add(array[1]);