5

我对字符串有一点问题。字符串看起来像这样:

A/46\-54.67/48\-6.94/52\2.41/54\0.00/38\-0.18/34\0.06/32\-27.22 (...)

这是来自 UDP 请求的答案。请求就像: R/46/48(...)/32(...) ,这意味着:给我 #46,#48 的值...答案如上所示。

目标:

最后,我只希望每个请求的特定值作为字符串中的双精度值。

我最喜欢的是带有 3(或 2)个参数的课程。第一个参数将是它自己的字符串,第二个参数是字符串内的位置(如 46\ 之后的值)。并且,如果需要,三分之一作为值的结尾,如 /。它返回一个包含值的数组。

(对我来说不是一个真正的解决方案:我只能一次请求 Value,所以答案会更容易处理。问题,如果每次必须做更多的 UDP 请求。当前请求将是每秒 10 次, ultimatley 它会更频繁。我必须用这些值来计算)

问题:

字符串不一致。返回的值可以有不同的数字,可以有符号也可以没有。一致只是:A/46\(digit for value 46)/48\(digit)/52\(digit)/54\(digit)/38\_/34\_/32\_ 如您所见,值在“\ /”之间。我得到了一个“解决方案”,可以将值削减到特定位置。但是当数字改变时它失败了。

解决方案?

(是的,我是一个真正的 Java 新手)我的尝试给了我一个看起来像这样的数组:

A/46

-54.67/48

-6.94/52

2.41/54

0.00/38

-0.18/34

0.06/32

-27.22

所以,现在我不知道如何从值中获取最后一部分以将它们转换为双精度(数组)。

我希望我已经生动地描述了我的问题。

感谢您的意见和建议。

4

5 回答 5

3

从拆分开始/;你会得到一个字符串数组,如下所示:

[ "A", "46\\-54.67", ... ]

忘记第一个元素;然后,对于每个其他元素,请执行以下操作:

Double.parseDouble(theElement.subString(theElement.indexOf('\\')))

这会让你得到double你想要的;您剩下要做的就是将这些doubles 放在您想要的地方。

另一种解决方案是使用此正则表达式循环遍历字符串:

(\d+)\\(-?\d+\.\d+)

正则表达式的第一组捕获整数,第二组捕获双精度:

final Pattern p = Pattern.compile("(\\d+)\\\\(-?\\d+\\.\\d+)");

final Matcher m = p.matcher(resultString);

while (m.find())
     // deal with m.group(1), m.group(2)
于 2013-07-09T15:48:40.140 回答
3

这个基于正则表达式的代码可能对您有用:

String str = "A/46\\-54.67/48\\-6.94/52\\2.41/54\\0.00/38\\-0.18/34\0.06/32\\-27.22/38";
Pattern p = Pattern.compile("\\\\(-?\\d+\\.\\d+)/(\\d+)");
Matcher m = p.matcher(str);
while (m.find()) {
    System.out.printf("Before: %s, After: %s%n", m.group(1), m.group(2));
}

输出:

Before: -54.67, After: 48
Before: -6.94, After: 52
Before: 2.41, After: 54
Before: 0.00, After: 38
Before: -0.18, After: 34
Before: -27.22, After: 38

编辑:将这些匹配的值放在 ArrayLists 中:

String str = "A/46\\-54.67/48\\-6.94/52\\2.41/54\\0.00/38\\-0.18/34\0.06/32\\-27.22/38";
Pattern p = Pattern.compile("\\\\(-?\\d+\\.\\d+)/(\\d+)");
Matcher m = p.matcher(str);
List<Double> beforeList = new ArrayList<Double>();
List<Integer> afterList = new ArrayList<Integer>();
while (m.find()) {
    beforeList.add(Double.parseDouble(m.group(1)));
    afterList.add(Integer.parseInt(m.group(2)));
}
System.out.printf("Before: %s, After: %s%n", beforeList, afterList);
于 2013-07-09T16:05:35.407 回答
1

我在没有使用 IDE 的情况下输入了这个,所以可能会有一些小错误:

//Split at /
String[] parts = udpResponse.split("/");

//for each part (apart from the initial A)
for (int i=1; i<parts.length; i++) {

   //the part is of the form aaa\bbb where aaa and bbb are numbers
   String[] keyValue = parts[i].split("\\");
   double key = Double.parseDouble(keyValue[0]); //number before \
   double value = Double.parseDouble(keyValue[1]); //number after \

   //do whatever you like with the numbers... 
}
于 2013-07-09T15:56:28.237 回答
1

尝试这个

   String test="A/46\\-54.67/48\\-6.94/52\\2.41/54\\0.00/38\\-0.18/34\\0.06/32\\-27.22";
   String[] arr=test.split("\\\\");
   double[] dub=new double[arr.length];
   int k=0;
   for (String i:arr){
        if(i.split("/").length!=1) {
        dub[k]=Double.parseDouble(i.split("/")[1].trim());
        k++;
        }
   }
于 2013-07-09T16:00:44.333 回答
0

我建议您使用String.split(). 对于相对简单的字符串解析来说,这是一个方便的功能,例如您在此处的示例。首先,您需要在“/”上拆分 UDP 回复。看起来您忽略String了结果数组中的第一个和最后一个 s。对于剩余String的 s,您可以使用 for 循环String.split()依次调用它们中的每一个,在 '\' 字符上进行拆分。

于 2013-07-09T16:17:52.303 回答