0

我有一个包含以下数据的文本文件:

20;
1: 39, 63;
2: 33, 7;
16: 33, 7;
3: 45, 27;
4: 8, 67;
5: 19, 47;
6: 15, 40;
...
20: 65, 54;

第一个整数是列表中条目的数量。

每一行都是一个条目。所以条目 1 的 xy 坐标分别为 39 和 63。我知道我可以使用不同的分隔符来读取数据,但我不太确定如何实现这一点。目前我正在使用split().

以下代码读取每一行,但这显然不起作用,因为分隔符没有正确设置。有什么好方法可以让它工作吗?

String[] temp = sc.next().split(";");
int productAmount = Integer.parseInt(temp[0]);
sc.nextLine();

for (int i = 0; i < productAmount; i++) {
    int productID = sc.nextInt();
    int x = sc.nextInt();
    int y = sc.nextInt();
    Product product = new Product(x, y, productID);
    productList.add(product);
}
4

3 回答 3

1

删除最后一个字符后,所有标记都可以转换为整数。您可以利用给定数据的这个属性。定义一个这样的方法:

int integerFromToken(String str) {
    return Integer.valueOf(str.substring(0, str.length() - 1));
}

它返回令牌的整数部分(39,返回3963;返回63等)。现在使用该方法从令牌中获取整数值(通过 获得sc.next()):

int productID = integerFromToken(sc.next());
int x = integerFromToken(sc.next());
int y = integerFromToken(sc.next());
于 2013-10-30T22:21:29.680 回答
1

如果你使用

String[] temp = sc.next().split("[ ,:;]");

那么你的temp变量将只保存数字。该字符串"[ ,:;]"是一个正则表达式,这意味着方括号中的任何字符都将是一个分隔符。

于 2013-10-30T22:37:13.047 回答
0

与Croo所说的非常相似,但是当我使用他的方法时出现编译错误。

为了避免通过包含空格作为分隔符来匹配空字符串,对我来说更有意义的是允许它们并使用调用来trim摆脱它们。

知道Scanner可以给定一个regex表达式作为分隔符,然后调用 tonext可用于导航输入,这也很有用。

sc.useDelimiter("[,:;]");
int productAmount = Integer.parseInt(sc.next());
int x, y, productID, i;
for (i = 0; i < productAmount; i++) {
    productID = Integer.parseInt(sc.next().trim());
    x = Integer.parseInt(sc.next().trim());
    y = Integer.parseInt(sc.next().trim());
    productList.add(new Product(x,y,productID));
}
于 2013-10-30T23:10:12.543 回答