我有一个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);
}
}
这是正常工作并且根据需要但是还有其他任何可行的方法。我想不出任何其他:(
答案 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]);