【问题标题】:Numbers from a string into a list java将数字从字符串转换为列表 java
【发布时间】:2014-05-02 04:21:18
【问题描述】:

所以我使用 http post 方法从 API 请求一些数据,然后我收到一个 JSON 响应,然后我有一个看起来像 JSON 响应的字符串,如下所示:

{"status": "OK", "results": [{"score": 0.0, "id": "2"}, {"score": 1.0, "id": "3"}, {"score": 0.0, "id": "0"}, {"score": 0.0, "id": "1"}, {"score": 0.0, "id": "6"}, {"score": 0.23606, "id": "7"}, {"score": 0.0, "id": "4"}, {"score": -0.2295, "id": "5"}, {"score": 0.41086, "id": "8"}, {"score": 0.39129, "id": "9"}]}

我想从这个列表中提取数字,或者更好地检查有多少数字在 0.2-1.0 之间,如果这个条件为真,则增加一个我拥有的整数值。

例如,我想做这样的事情,但我找不到适合我的语法。

    if(responseString.contains("0.0-0.2")
    {
    OccurencesNeutral++
    }
    if(responseString.contains("0.2-1.0")
    {
    OccurencesPositive++
    }

【问题讨论】:

    标签: java json string integer contains


    【解决方案1】:

    在处理 JSON 时,您应该使用JSONObject API。在你的情况下,这样的事情应该可以工作:

    try {
        JSONObject json = new JSONObject(theStringYouGot);
        JSONArray results = json.getJSONArray("results");
        for (int i = 0; i < results.length(); i++) {
            JSONObject data = results.getJSONObject(i);
            double score = data.getDouble("score");
        }
    } catch (JSONException x) {
        // Handle exception...
    }
    

    在您的代码中,您可能应该将硬编码的字段名称替换为干净代码的常量。

    【讨论】:

    • 嘿,克里斯,这似乎正是我正在寻找的东西,但我在 JSONObject data = results1.get(i); 行出现错误我对 JSON 很陌生,因此为什么我立即将 responsebody 更改为字符串
    • 我更新了我的答案,现在可以了吗?我只是从脑海中写出来的,所以它可能有杂散的语法错误......
    • 它现在正在使用 results1.get(i) 行,但它似乎不喜欢将 data.get("score") 声明为双精度?
    • 如果我将其转换为双精度,则会出现 JSONArray 无法转换为 JSONObject 的错误
    • 好的,抱歉,需要使用getDouble 而不仅仅是get。它现在应该可以工作了。
    【解决方案2】:

    如果你使用的是 Json 库,会有方法序列化并从字符串创建一个 Object,因此你可以使用正确的 get 方法搜索新对象中的数字。

    例如在 org.json 中你可以这样做

    JSONObject jsonObj = new JSONObject("your string");
    

    【讨论】:

      【解决方案3】:

      在 groovy 中执行此操作的代码(将 0.2 更改为 args)

      def JsonSlurper js = new JsonSlurper()
      def o = js.parseText(jsonStr)
      def (neu, pos) = [0, 0]
      o.results.each {
          if (it.score <= 0.2) neu ++
          else pos ++
      }
      println "$neu $pos"
      

      【讨论】:

        【解决方案4】:

        如果你想要正则表达式试试这个,

            int OccurencesNeutral=0;
            int OccurencesPositive=0;
            String regex="((-?\\d+)\\.(\\d+))";
            String str="{\"status\": \"OK\", \"results\": [{\"score\": 0.0, \"id\": \"2\"}, {\"score\": 1.0, \"id\": \"3\"}, {\"score\": 0.0, \"id\": \"0\"}, {\"score\": 0.0, \"id\": \"1\"}, {\"score\": 0.0, \"id\": \"6\"}, {\"score\": 0.23606, \"id\": \"7\"}, {\"score\": 0.0, \"id\": \"4\"}, {\"score\": -0.2295, \"id\": \"5\"}, {\"score\": 0.41086, \"id\": \"8\"}, {\"score\": 0.39129, \"id\": \"9\"}]}";
        
            Pattern p=Pattern.compile(regex);
            Matcher m=p.matcher(str);
        
            float f=0;
            while(m.find()){
                f=Float.parseFloat(m.group());
                if(f>0 && f<0.2)
                    OccurencesNeutral++;
                if(f>0.2 && f<1.0)
                    OccurencesPositive++;
            }
        
            System.out.println("Neutral="+OccurencesNeutral+"\t"+"Positives="+OccurencesPositive);
        

        【讨论】:

        • 嘿 RKC 感谢您的回复,这似乎在大多数情况下都有效,但是如果分数是例如 -0.23553,它仍然会添加到occurrencesPositive,这个正则表达式是否适用于负数我尝试添加 if(f
        • 修改了我上面的正则表达式。现在它也适用于负数。
        • 辉煌!非常感谢,只是为了帮助我理解它正在搜索字符串,然后寻找数字的模式(现在可以是减号)。然后另一个数字正确?然后当找到它时,我们使用匹配器来分配我们想要的类型,即 pos、neg 或 neu
        • 通过这个可以清楚地了解正则表达式模式。vogella.com/tutorials/JavaRegularExpressions/article.html
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 2014-06-17
        • 2021-08-26
        相关资源
        最近更新 更多