使用Java中的Scanner忽略字符

时间:2017-08-08 08:23:38

标签: java java.util.scanner

我想从标准输入中取出多个坐标点,比如说(35,-21)(55,12)...并将它们放入各自的数组中。

我们称之为x []和y []。

x []将包含{35,55,...},而y []将包含{-21,12,...}等等。

但是,我似乎找不到绕过括号和逗号的方法。

在c中我使用了以下内容:

double[] x = new double[SIZE];
double[] y = new double[SIZE];
Scanner sc = new Scanner(System.in);

for(int i=0; i < SIZE; i++) {
    x[i] = sc.nextDouble();
}

然而,在Java中,我似乎找不到绕过非数字字符的方法。

我目前在Java中有以下内容,因为我被卡住了。

float

所以问题是: 从扫描仪读取双打时如何忽略字符?

快速修改:

我的目标是在用户输入上保持严格的语法(12,-55),并能够输入多行坐标点,例如:

(1,1) (2,2) (3,3) ...

3 个答案:

答案 0 :(得分:2)

scanner.next()尝试从输入中获取一个双精度数。它只是意味着解析输入流并按本身计算如何解释该字符串以某种方式提取数字。

从这个意义上说:单独使用扫描仪根本不起作用。你可以考虑使用tokenizer - 或者使用declare @sql nvarchar(max) select @sql = 'Select ' + STUFF((select ', (select count(*) from [' + t.name + ']) as [' + t.name + ']' from sys.tables t FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') execute (@sql) 来返回完整的字符串;然后进行手动拆分/解析,或者转向regular expressions来执行此操作。

答案 1 :(得分:1)

我会通过多个步骤来提高可读性。首先是System.in使用扫描仪进行检索,然后进行拆分以分别获取每组坐标,然后您可以在以后处理它们,无论出于何种目的。

类似的东西:

Scanner sc = new Scanner(System.in);
String myLine = sc.nextLine();

String[] coordinates = myLine.split(" ");
//This assumes you have a whitespace only in between coordinates 

String[] coordArray = new String[2];
double x[] = new double[5];
double y[] = new double[5];
String coord;

for(int i = 0; i < coordinates.length; i++)
{
  coord = coordinates[i];
  // Replacing all non relevant characters
  coord = coord.replaceAll(" ", "");
  coord = coord.replaceAll("\\(", ""); // The \ are meant for escaping parenthesis
  coord = coord.replaceAll("\\)", "");
  // Resplitting to isolate each double (assuming your double is 25.12 and not 25,12 because otherwise it's splitting with the comma)
  coordArray = coord.split(",");
  // Storing into their respective arrays
  x[i] = Double.parseDouble(coordArray[0]);
  y[i] = Double.parseDouble(coordArray[1]);
}

请记住,这是一个基本的解决方案,假设严格遵守输入字符串的格式。

请注意,我实际上无法完全测试它,但应该只保留一些简单的解决方法。

答案 2 :(得分:0)

提到用户输入严格限制为(12,-55)或(1,1)(2,2)(3,3)...格式以下代码可以正常工作

    Double[] x = new Double[5];
    Double[] y = new Double[5];

    System.out.println("Enter Input");
    Scanner scanner = new Scanner(System.in);
    String input = scanner.nextLine();
    input = input.trim();

    int index = 0;

    while(input != null && input != "" && input.indexOf('(') != -1) {
        input = input.trim();
        int i = input.indexOf('(');         
        int j = input.indexOf(',');
        int k = input.indexOf(')');
        x[index] = Double.valueOf(input.substring(i+1, j));
        y[index] = Double.valueOf(input.substring(j+1, k)); 
        System.out.println(x[index] + " " + y[index]);
        input = input.substring(k+1);           
        index++;            
    }

这里我以字符串格式输入用户输入,然后调用trim方法来删除前导和尾随空格。

在while循环中,'('',')之间的子串被置于 x [] ','和')'会被纳入 y []

在循环中,索引递增,输入字符串在第一次出现')'后被修改为子字符串,直到字符串结束。

重复循环,直到没有出现')'或输入为空。