【问题标题】:Read from file and parse them into different arrays从文件中读取并将它们解析为不同的数组
【发布时间】:2017-08-11 17:06:13
【问题描述】:

我将读取文件内容作为程序的输入。

我将其存储为一个字符串并将其拆分为 2 个字符串。

File file = new File("question.txt");
PrintWriter pw = new PrintWriter(file);
pw.write("81 : (1,53.38,$45) (2,88.62,$98) (3,78.48,$3) (4,72.30,$76) (5,30.18,$9) (6,46.34,$48)");
pw.close();
BufferedReader br = new BufferedReader(new FileReader(file));
String line = br.readLine();
Map<Integer, Object> map = new HashMap<Integer, Object>();
int i = 0;
Demo d = new Demo();
String[] part = line.split(":");
String part1 = part[0].trim();
String part2 = part[1].trim();

输入: 81 : (1,53.38,$45) (2,88.62,$98) (3,78.48,$3) (4,72.30,$76) (5,30.18,$9) (6,46.34,$48)

输出:

totalWeight = 81;
index[] = {1,2,3,4,5,6}; 
weight[] = {53.38,88.62,78.48,72.30,30.18,46.34};  
value[] = {45,98,3,76,9,48}; 

第二个字符串在括号内包含 3 个值。第一个数字是“索引”,第二个数字是“重量”,第三个数字是“价值”。
如何拆分并将其存储到 3 个不同的数组中?

我知道一种方法是将其解析为具有 3 个数组的类的对象并为其分配值。
但是有没有更好的方法呢?

【问题讨论】:

    标签: java arrays string parsing objectmapper


    【解决方案1】:
    String[] part2 = part[1].replace("(", "").trim().split(")");
    List<String> indices = new ArrayList<String>();
    List<String> weights= new ArrayList<String>();
    List<String> values = new ArrayList<String>();
    
    for (String s : part2)
    {
       String item = s.split(",");
       indices.add(item[0]);
       weights.add(item[1]);
       values.add(item[2]);
    }
    
    // to get them as arrays
    String[] allWeightsArray = weights.toArray(new String[]); ...
    

    【讨论】:

    • 它们不在方括号中。
    • 我在下面添加了输入输出。
    • 根据您的输入/输出数据修改了我的答案
    【解决方案2】:

    使用此代码解析这种格式的字符串:

    String[] structured = part2.replaceAll("[()]", "").split(" ");
    
    List<String> indexes = new ArrayList<>();
    List<String> weights = new ArrayList<>();
    List<String> values = new ArrayList<>();
    
    for (String elem : structured) {
        String[] parsed = elem.split(",");
        indexes.add(parsed[0]);
        weights.add(parsed[1]);
        values.add(parsed[2]);
    }
    

    【讨论】:

      【解决方案3】:

      使用split方法通过[\(?+\\)]+\s+分割字符串

      String x = part[1].trim(); 
      String[] items = x.split("[\\(?+\\)]+\\s+");
      List<String> indexs = new ArrayList<>();
      List<String> wights = new ArrayList<>();
      List<String> values = new ArrayList<>();
      for(String item : items)
      {
          item = item.replace("(" , "").replace(")" , "").trim();
          String[] partItems = item.split(",");
          indexs.add(partItems[0]);
          wights.add(partItems[1]);
          values.add(partItems[2]);
      }
      
      System.out.println(Arrays.toString(indexs.toArray()));
      System.out.println(Arrays.toString(wights.toArray()));
      System.out.println(Arrays.toString(values.toArray()));
      

      输出

      [1, 2, 3, 4, 5, 6]
      [53.38, 88.62, 78.48, 72.30, 30.18, 46.34]
      [$45, $98, $3, $76, $9, $48]
      

      【讨论】:

        【解决方案4】:

        您可以使用这样的模式解决您的问题:

        String str = "81 : (1,53.38,$45) (2,88.62,$98) (3,78.48,$3) "
            + "(4,72.30,$76) (5,30.18,$9) (6,46.34,$48)";
        
        String regex = "\\((\\d+),(\\d+\\.\\d+),([^\\d](\\d+))\\)";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        double totalWeight = Double.parseDouble(str.replaceAll("^(\\d+).*", "$1"));
        List<Integer> indexes = new ArrayList<>();
        List<Double> weights = new ArrayList<>();
        List<Integer> valuess = new ArrayList<>();
        
        while (matcher.find()) {  
            indexes.add(Integer.parseInt(matcher.group(1)));
            weights.add(Double.parseDouble(matcher.group(2)));
            valuess.add(Integer.parseInt(matcher.group(4)));
        }
        
        System.out.println(totalWeight);// 81.0
        System.out.println(indexes);    // [1, 2, 3, 4, 5, 6]
        System.out.println(weights);    // [53.38, 88.62, 78.48, 72.3, 30.18, 46.34]
        System.out.println(valuess);    // [45, 98, 3, 76, 9, 48]
        
        • 总权重是输入中的第一个数字,您可以使用 replaceAll 获取它,然后解析输入 Double.parseDouble(str.replaceAll("^(\\d+).*", "$1"));
        • 要获取其余信息,您可以使用此正则表达式 \((\d+),(\d+\.\d+),([^\d](\d+))\) (regex demo),它可以匹配两个 () 之间的三个不同数字,在您的情况下,您有很多结果可以使用模式。李>

        【讨论】:

          猜你喜欢
          • 2021-06-09
          • 2013-01-07
          • 2016-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多