java - 给定一个具有字符串类型值的 Map,这些值都是用逗号分隔的数字,是否可以将每个值转换为双精度值?
问题描述
我最近询问了如何将使用 Gson 的 Json 转换为我可以对值进行排序的东西,最好的选择是使用 Linked HashMap。
List<String> stringList = Arrays.asList(tm.split(" |,")); // split into pair key : value
Map<String, List<String>> mapString = new LinkedHashMap<>();
stringList.forEach(s1 -> {
String[] splitedStrings = s1.split(": "); //split into key : value
String key = splitedStrings[0].replaceAll("[^A-Za-z0-9]",""); // remove non alphanumeric from key, like {
String value = splitedStrings[1];
if (mapString.get(key) == null) {
List<String> values = new ArrayList<>();
values.add(value);
mapString.put(key, values);
}else if (mapString.get(key) != null) {
mapString.get(key).add(value);
}
});
运行此代码时,将创建一个映射,其中包含我的数据的频率、幅度和其他属性的键。这是原始 Json 消息与同一组数据的结果映射值相比(格式化以使其更易于理解和更好看)
{"groupId":"id3_x_","timestamp":1.591712740507E9,"tones":
[{"frequency":1.074,"level":3.455,"bw":0.34,"snr":3.94,"median":0.877},
{"frequency":14.453,"level":2.656,"bw":0.391,"snr":2.324,"median":1.143},
{"frequency":24.902,"level":0.269,"bw":0.282,"snr":2.216,"median":0.121},
{"frequency":22.607,"level":0.375,"bw":0.424,"snr":2.034,"median":0.184},
{"frequency":9.863,"level":2.642,"bw":0.423,"snr":1.92,"median":1.376}]}
映射值:
Message Received
Group ID: id3_x_
Message Topic: pi7/digest/tonals
Time of Arrival: 1.591712740507E9
---------------DATA---------------
Frequency: [1.07, 14.45, 24.90, 22.61, 9.86]
Magnitude: [3.46, 2.66, 0.27, 0.38, 2.64]
Bandwidth: [0.34, 0.39, 0.28, 0.42, 0.42]
SNR: [3.94, 2.32, 2.22, 2.03, 1.92]
Median: [0.88, 1.14, 0.12, 0.18, 1.38]]
虽然这对于分析数据非常有用,但存储的信息是一个字符串。我想做的是将地图中的每个值(例如:频率 1.07、14.45 等)转换为双精度值,然后我可以通过其他程序运行并运行计算,例如平均值。我在网上环顾四周,并没有找到任何我正在寻找的东西,所以我想知道是否有一种方法可以使用数组、列表或任何其他方式将这些字符串转换为双精度。
我是一家科技公司的实习生,所以我仍在尝试使用 Java 并描述我在说什么,所以如果对我所问的内容有任何疑问,请提前告诉我并感谢!
解决方案
你的问题:
我希望能够将
String
地图中的每个值(例如:频率 1.07、14.45 等)转换为双精度值并运行计算,例如平均值。
是的,可以使用如下方式将String
数组转换为数组:double
Stream
String[] frequencies = { "1.07", "14.45", "24.90", "22.61", "9.86" };
double[] arr = Stream.of(frequencies)
.mapToDouble(Double::parseDouble)
.toArray();
如果您使用DoubleSummaryStatistics
该类,则您已经有可用的操作,例如 avg, sum :
String[] frequencies = { "1.07", "14.45", "24.90", "22.61", "9.86" };
DoubleSummaryStatistics statistics = Stream.of(frequencies)
.mapToDouble(Double::parseDouble)
.summaryStatistics();
System.out.println(statistics.getAverage()); //<-- 14.578
System.out.println(statistics.getMax()); //<-- 24.9
推荐阅读
- ruby-on-rails - 使用 gem 在 ruby 项目上生成声纳报告
- firebase - Firestore 空查询返回不可为空的字段
- angular - 我究竟做错了什么?角垫形式场
- google-colaboratory - 使用 ImageAI 库进行图像识别
- python - 使用 Pandas 将带有 html 标签的管道分隔文件读入数据框
- java - 为什么 SynchronizedList get 方法需要用 java 中的同步包装
- javascript - 使用 React-Audio-Player 在鼠标移动时自动播放音频文件
- apache-kafka - 安装在单台 PC 上时如何提高 Kafka(生产者和消费者)的性能
- google-bigquery - 将时间戳转换为特定时区然后在 bigquery 中将其转换为日期时出现问题
- node.js - 用nodejs上传图片