2014-12-22 28 views
0

我在我的C盘中有一个名为new.txt的文本文件,我试图使用下面的程序将此文件的内容使用Java程序导入到我的多维数组中。从文本文件中添加数组值并将它们打印

package square; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.Reader; 
import java.nio.Buffer; 
import java.util.Arrays; 
import java.util.Scanner; 

public class Square { 

    public static void main(String[] args) { 
     String a[][] = new String[4][4]; 
     try { 
      FileReader fr = new FileReader("C://new.txt"); 
      Scanner scanner=new Scanner(fr); 
      for (int i = 0; i < 5; i++) { 
       for (int j = 0; j < i; j++) { 
        a[i][j] = scanner.next(); 
       } 
      } 
      System.out.print(Arrays.deepToString(a)); 
      scanner.close(); 
     } 

     catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 
} 

在这里,当我试图运行这个程序时,我得到了下面的异常。

Exception in thread "main" java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Unknown Source) 
    at square.Square.main(Square.java:20) 
当我改变 a[i][j] = scanner.next(); a[i][j] = scanner.nextInt();到并改变阵列类型 int米它投掷以下例外

Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at square.Square.main(Square.java:20) 

请让我知道我在哪里错了,以及如何解决它。

我的文本文件的内容是。

##### 
##### 
##### 
##### 
….. 
+3

是您的文本文件真的''#或数字的内容?请提供一个真实的例子。 – aioobe

+0

以及对于初学者改变你的for循环'对(INT I = 0; I <则为a.length;我++){对于(INT J = 0;Ĵ chancea

+0

嗨@aioobe,这是我在我的文本文件中的确切内容。 – user3872094

回答

0

这里的问题是简单。首先看看你的文本文件:

##### 
##### 
##### 
##### 
….. 

在这里,我们有5个标记(4 x'#####'和1 x'... ..')。在next()函数中看看: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

NoSuchElementException - if no more tokens are available 
IllegalStateException - if this scanner is closed 

因此,在扫描仪读取最后一个标记后,即'... ..',不再有可用的标记。

这里我的建议解决方案:

import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class Square { 

    public static void main(String[] args) { 
     String a[][] = new String[5][5]; 
     try { 
      FileReader fr = new FileReader("new.txt"); 
      Scanner scanner=new Scanner(fr); 
      ArrayList<String> l = new ArrayList<String>(); 
      while(scanner.hasNext()) 
      { 
       l.add(scanner.next()); 
      } 
      for(int i = 0; i < l.size(); ++i) 
      { 
       String toSplit = l.get(i); 
       String[] splitted = toSplit.split(""); 
       for(int j = 0; j < splitted.length; ++j) 
       { 
        a[i][j] = splitted[j]; 
       } 
      } 
      scanner.close(); 
     } 

     catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     // test the result 
     for(int i = 0; i < a.length; ++i) 
     { 
      for(int j = 0; j < a[i].length; ++j) 
      { 
       System.out.println(a[i][j]); 
      } 
     } 
    } 
} 

关注:最后两行是空的,因为最后一个记号具有3个字符。 所以[4] [3]和[4] [4]将为空。

+0

嗨,这是真棒,按预期工作,但你可以帮我做这个使用数组。谢谢 – user3872094

+0

你能告诉我你想要什么吗?你想要一个多维数组,每个单元格都是一个角色吗? – ProgrammingIsAwsome

+0

是的,这就是我想要的 – user3872094

0

默认分隔符为白色space.Since你没有任何空白的第一个字符串阅读本身是##### \ n ##### \ n ##### \ N# ####。但也有很多其他的事情就像这个problem.Can循环错误,你试试下面的变化,看看它是否适合you.Otherwise请提供更多的解释

String a[][] = new String[5][5]; 
Scanner scanner=new Scanner(fr).useDelimiter(""); 
for (int i = 0; i < 5; i++) 
    for (int j = 0; j < 5; i++) { 
     if(scanner.hasNext("\n")) 
      scanner.next(); 
     a[i][j] = scanner.next(); 
     } 

System.out.print(Arrays.deepToString(a)); 
     scanner.close(); 
+0

我得到'异常线程 “main” java.util.NoSuchElementException \t在java.util.Scanner.throwFor(来源不明) \t在java.util.Scanner.next(来源不明) \t在square.Square。主(Square.java:24) ' – user3872094

0

一个shote提前注:

请检查您的String阵列的两个维度。目前它是

new String[4][4]; 

并允许存储16个值(4x4)。循环中使用的代码看起来像您期望更多的值。因此,我的阵列增加到

new String[5][5]; 

我们可能回答你的问题:

在外部for -loop规避5固定值我一个while -loop替代它:

int i=0; 
while (scanner.hasNextLine()) { 
    String line = scanner.nextLine(); 
    String[] separatedChars = line.split("(?!^)"); 
    for (int j = 0; j < 5; j++) { 
    a[i][j] = separatedChars[j]; 
    } 
    i++; 
} 
System.out.print(Arrays.deepToString(a)); 
scanner.close(); 

而不是仅使用内部的下一个for -loop我使用scanner.nextLine()来读取一个完整的行,然后将其拆分。结果然后用于填充给定的数组。 输出四行的5倍#

[[#, #, #, #, #], [#, #, #, #, #], [#, #, #, #, #], [#, #, #, #, #], [null, null, null, null, null]]s 
相关问题