我正在读取文件,输入如下:
Description (1.0,2.0) (2,7.6) (2.1,3.0)
Description2 (4,1)
...
Description_n (4,18) (8, 7.20)
我希望能够将数字放在括号内并使用从字符串转换为数字,以便我可以对它们进行数学运算。现在,为了简化事情,我的代码只读取第一行,然后根据空格分割它:
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(new File("filename.txt")));
//reader reads in the first line
String firstLine = reader.readLine();
//splits into an array of ["Description","(1.0,2.0)","(2,7.6)","(2.1,3.0)"]
String[] parts = first.split(" ");
//now I want to store 1.0, 2, and 2.1 in one array as ints and 2.0, 7.6, and 3.0 in another int array
} catch (Exception e) {
System.exit(0);
}
有什么方法可以将括号内的数字存储到两个单独的整数数组中(参见上面的注释)?我应该使用正则表达式以某种方式捕获“([1-9。],[1-9。])”形式的东西,然后将它们传递到另一个函数,然后将该对中的第一个数字与第二个和然后将它们转换成整数?我是Java中正则表达式解析的新手,所以我不确定如何实现它。
或者有一种简单,更好的方法吗?
答案 0 :(得分:1)
如何解析每个项目:
Double.parseDouble(“你的字符串在这里”);
至于存储,我没有得到你想要存储你的值的模式。你想要1个数组中的1.0,2和2.1以及2.0,7.6和3.0的另一个数据的原因是什么?
答案 1 :(得分:1)
只需执行Integer.parseInt(string)或Double.parseDouble(string),然后将其添加到数组中。但是,我并不是100%确定你要问的是什么。
答案 2 :(得分:1)
这会将数字存储到Double
- 数组(不是二维数组,Double
个对象的数组),因为有些数据有.#
。 int-arrays将消除后十进制部分。
它使用正则表达式\b([\d.]+)\b
查找每个paren-group中的每个数字,并将每个数字添加到ArrayList<Double>
。请注意,它假设所有输入都是完美的(不像(bogus,3.2)
。然后将列表转换为Double
个对象的数组。
这应该会为你的目标提供良好的开端。
import java.util.Arrays;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
<P>{@code java DoubleInParenStringsToArrays}</P>
**/
public class DoubleInParenStringsToArrays {
public static final void main(String[] ignored) {
String input = "(1.0,2.0) (2,7.6) (2.1,3.0)";
String[] inputs = input.split(" ");
//"": Dummy string, to reuse matcher
Matcher mtchrGetNums = Pattern.compile("\\b([\\d.]+)\\b").matcher("");
for(String s : inputs) {
ArrayList<Double> doubleList = new ArrayList<Double>();
mtchrGetNums.reset(s);
while(mtchrGetNums.find()) {
//TODO: Crash if it's not a number!
doubleList.add(Double.parseDouble(mtchrGetNums.group(0)));
}
Double[] doubles = doubleList.toArray(new Double[doubleList.size()]);
System.out.println(Arrays.toString(doubles));
}
}
}
输出:
[C:\java_code\]java DoubleInParenStringsToArrays
[1.0, 2.0]
[2.0, 7.6]
[2.1, 3.0]
答案 3 :(得分:0)
我会使用字符串标记符。但是需要更多的信息和想法才能完全实现。
这是你的行:“描述(1.0,2.0)(2,7.6)(2.1,3.0)”
首先 - 有没有括号的情况?会不会有f 2,2,2个数字?
您是否想要处理每个号码的错误,或者只是在出现错误时跳过该行或跳过处理(如数字的数量不匹配?)。
现在您需要一个数据结构来保存数字。如果每个数字在域中具有不同的含义,或者如果要将它们视为简单的数字列表,则可以创建一个类以将每个单独的元素保存在单独的属性中(如果每个数字在域中具有不同的含义)或具有数组列表或简单数组。如果是一级样本(不完整):
class LineItem {
}
现在要实际分解字符串有很多方法可以做到这一点。真的取决于数据的质量以及您希望如何处理可能的错误
一种方法是找到第一个左括号(取其余的字符串并使用字符串标记符解析出来。
类似的东西:
int i = str.indexOf("(");
String s2 = str.substring(i);
StringTokenizer st = new StringTokenizer(s2, "() ,";//parenthesis, comma and space
ArrayList<Double> lineVals1 = new ArrayList<Double>();
ArrayList<Double> lineVals1 = new ArrayList<Double>();
int cnt = 0;
while(st.hasMoreTokens()){
cnt++;//use this to keep count of how many numbers you got in line and raise error if need be
String stemp = st.nextToken();
if(isNumeric(stemo)){
if(cnt % 2 == 1){
lineVals1.add(Double.parseDouble(stemp));
}else{
lineVals2.add(Double.parseDouble(stemp));
}
}else{
/raise error if not numberic
}
}
public static boolean isNumeric(String str)
{
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition pos = new ParsePosition(0);
formatter.parse(str, pos);
return str.length() == pos.getIndex();
}