【问题标题】:Given a Map with values of type string, which are all numbers separated by commas, would it be possible to transform each value into a double?给定一个带有字符串类型值的 Map,这些值都是用逗号分隔的数字,是否可以将每个值转换为双精度值?
【发布时间】:2020-06-09 14:55:38
【问题描述】:

我最近询问了如何将使用 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 并描述我在说什么,所以如果对我所问的内容有任何疑问,请提前告诉我并感谢!

【问题讨论】:

    标签: java string list hashmap double


    【解决方案1】:

    您可以从 JSON 文件中获取 Map,也可以从 Map yourmap.getvalues() 中提取值数组,然后您可以解析这些元素中的每一个并将其大小写为 double


    示例:频率:[1.07, 14.45, 24.90, 22.61, 9.86]

    for ( String f : Frequency ) {
        double f_double = Double.parse(f); // turns String into double
        }
    

    【讨论】:

      【解决方案2】:

      您可以使用另一个将重复属性值存储在数组中的类来执行此操作。您可以简单地通过 a.getValues() 获取它们。这只是一个概念,您应该扩展它,因为它对您来说很方便。

      import java.util.*;
      
      public class Main {
          public static void main(String[] args) {
              Map<String, List<Attribute>> map = new LinkedHashMap<>();
      
              List<Attribute> attributes = new ArrayList<>();
              attributes.add(new Attribute("frequency", 3.46, 5.11, 6.12));
              attributes.add(new Attribute("magnitude", 3.46, 10.22, 10.54));
              //and so on
      
              map.put("idString1", attributes);
      
              //printing double values
              for (String key : map.keySet()) {
      
                  for (Attribute a : map.get(key)) {
                      System.out.println(a.getName() + " " +Arrays.toString(a.getValues()));
                      //a.getValues() to get all of doubles
                  }
              }
          }
      
          private static class Attribute {
      
              private String name;
              private double[] values;
      
              Attribute(String name, double... values) {
                  this.name = name;
                  this.values = values;
              }
      
              String getName() {
                  return name;
              }
      
              double[] getValues() {
                  return values;
              }
          }
      
      }
      

      结果将是:

      frequency [3.46, 5.11, 6.12]
      magnitude [3.46, 10.22, 10.54]
      

      【讨论】:

        【解决方案3】:

        你的问题:

        我希望能够做的是将每个String 值转换为 将(例如:频率 1.07、14.45 等)映射成双精度并运行计算,例如平均值。

        是的,可以使用StreamString 数组转换为double 数组,如下所示:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          相关资源
          最近更新 更多