2017-08-08 72 views
1

我想从标准输入中获取多个坐标点,例如(35,-21)(55,12)...,并将它们放入相应的数组中。在Java中使用扫描仪忽略字符

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

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

但是,我似乎无法找到解决括号和逗号的方法。

在三我用的是以下几点:

for(i = 0; i < SIZE; i++) { 
    scanf("%*c%d%*c%d%*c%*c",&x[i],&y[i]); 
} 

但是在Java中,我似乎无法找到一个办法让周围的非数字字符。

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

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(); 
} 

所以问题: 从扫描仪在双打阅读时我怎么会忽略字符?

快速编辑:

我的目标是让用户输入严格的语法(12,-55),并且能够进入坐标点,如多行:

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

+0

输入是否需要强制括号? –

+1

使用'Scanner#nextLine()'作为字符串读取输入。 –

+0

是的,我想保持强制性(12,-65)语法的输入。 – Paul

回答

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]); 
} 

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

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

+0

请注意格式TO是askijng是'(1,1)(2,2)(3,3)',所以你的分裂字符串应该理想地重新分割。 – Nathan

+0

当然,一旦你有分割的字符串,你可以删除空格,括号,用逗号resplit,然后将它们存储到它们各自的数组中。 它可能不是最简单的方法,但它可能是最简单的方法,不需要使用复杂的正则表达式来使用前瞻或后视。 为了学习Java作为一个项目,我认为它是有道理的。 – Mumrau

+0

有了这个解决方案,myMethod将包含沿着String []坐标= myLine.split(“(,)”)的内容。为了删除剩余的非数字字符?传入数组列表,循环来分割每个人,并将它们分类到它们各自的数组中,然后传递给main? – Paul

2

nextDouble()尝试从输入取双号。这只是不是意思是解析输入流和图由本身如何解释该字符串以某种方式提取一个数字。

从这个意义上说:单独一台扫描仪根本不能在这里工作。您可以使用tokenizer来查找 - 或者您使用scanner.next()来返回完整的字符串;然后执行手动拆分/解析,或者转到regular expressions来完成此操作。

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++;    
    } 

在这里,我得到了在字符串格式的用户输入,然后修剪方法被调用它来删除前导和拖尾空格。

在while循环之间的子串 '('''被取入X []之间的子串 ''')'被取入ÿ []

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

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

+0

在这种情况下使用'indexOf'似乎很牵强。 – Nathan