2013-10-27 6 views
1

Предположим, у меня есть текстовый файл, подобный этому.Лучший способ чтения целых чисел из текстового файла в массив

1 4 6 
2 3  
5 8 9 4 
2 1 
1 

Что я хочу сделать, так это хранить их в массиве 2d точно так, как они представлены. После некоторых поисковых запросов и чтения я придумал следующий код.

Scanner s = new Scanner(new BufferedReader(new FileReader("myData.txt")));  

while (s.hasNextLine()) 
{ 
    String myStr = s.nextLine(); 
    x = 0; 
    for (int y = 0; y <= myStr.length(); y+=2) 
    { 
     myStr = myStr.trim(); 
     tempStr = myStr.substring(y, y+1) 
     num[row][coln] = Integer.parseInt(tempStr); 
     coln++ 
    } 
    row++; 
} 

Работает нормально, но для целых чисел, которые имеют только 1 цифру. Но что, если у меня целые числа разной длины. Как я могу это сделать, чтобы динамически проверять длину целых чисел?

Например, я хочу сохранить этот текстовый файл в 2d массив

13 4 652 
2 343  
5 86 9 41 
2 18 
19 

Если кто-то может мне точку в правильном направлении, что было бы очень полезно. Спасибо

+0

Поскольку у вас есть оборванный массив в любом случае, есть ли причина не использовать «Список»? – chrylis

+0

О, поскольку я просто тестировал программу, чтобы получить необходимую мне функциональность, я использовал то, с чем мне было удобно. Ur принимается так или иначе, будет использовать Список – kype

ответ

3

Вы можете использовать split() для струнных. Если вы используете пробел как разделитель, он вернет массив строк, где каждое число в строке будет отображаться в один интервал в массиве. Затем прокрутите массив и используйте Integer.parseInt().

Еще один способ сделать это - подать вывод от nextLine() в другой Scanner и использовать nextInt() для извлечения чисел.

+0

Работает отлично. Thanks mate – kype

+0

@kype без проблем. –

0

вы можете использовать метод nextInt класса сканера, он даст вам целочисленное значение по одному.

Firslty вы schould использовать метод hasnextXXX, чтобы проверить, есть ли целое значение в файле как

scanner.hasNextInt() 

Чем вы можете написать программу, как

import java.util.*; 

public class ScannerDemo { 
    public static void main(String[] args) { 

    Scanner scanner = new Scanner(new BufferedReader(new FileReader("myData.txt")));  


     while (scanner.hasNext()) { 
     if (scanner.hasNextInt()) { 
      System.out.println("integer present" + scanner.nextInt()); 
     } 
     System.out.println("no integer" + scanner.next()); 
     } 
     scanner.close(); 
    } 

}

из JavaDocs, метод nextInt() выбрасывает эти исключения в этих условиях:

InputMismatchException - if the next token does not match the Integer regular expression, or is out of range 
NoSuchElementException - if input is exhausted 
IllegalStateException - if this scanner is closed 
+0

Мне жаль спрашивать. Но почему сканер каскадируется без необходимости? сканер = s = новый сканер (новый буферизированный ...); // буквально это то, что происходит правильно? – kype

+0

сначала я думал конвертировать строку в сканер, чем я взял inpt, как вы, и забудьте изменить следующую строку. – SSP

0

Вы можете использовать этот код:

Scanner scan = new Scanner(new File("test.txt")); 
scan.useDelimiter("\\Z"); 
String content = scan.next(); 
ArrayList output=new ArrayList(); 
ArrayList<Inteher> inner=new ArrayList<Integer>(); 
String[] a1=content.split("\n"); 
for(String a:a1){ 
String a2=a1.plit(" "); 
for(String b:a2){ 
inner=new ArrayList<Integer>(); 
inner.add(Integer.parseInt(b)); 
} 
output.add(inner); 

} 
0

Я бы сделать это таким образом

String[] a = mystr.split(" +"); 
    num[i] = new int[a.length]; 
    for (int j = 0; j < a.length; j++) { 
     num[i][j] = Integer.parseInt(a[j]); 
    } 

Я также хотел бы изменить первую часть следующим

List<String> lines = Files.readAllLines(Paths.get("myData.txt"), StandardCharsets.UTF_8); 
    int[][] num = new int[lines.size()][]; 
    for(int i = 0; i < lines.size(); i++) { 
     ... 
0

Вы могли бы попробовать это :

try { 

     InputStream in = getClass().getResourceAsStream(s); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

     int[][] values = new int[numRows][numCols]; 

     int numRows = br.readLine(); 
     int numCols = br.readLine(); 

     String delims = "\\s+"; 
     for (int row = 0; row < numRows; row++) { 
      String line = br.readLine(); 
      String[] tokens = line.split(delims); 
      for (int col = 0; col < numCols; col++) { 
       values[row][col] = Integer.parseInt(tokens[col]); 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Для текстового файла, установите его так:

10 // amount of numbers across 
7 // amount of numbers down 
6 6 6 6 6 65 6 6 6 6 
6 6 7 6 6 6 6 6 6 6 
6 6 6 6 6 6 6 6 6 6 
6 6 6 6 6 6 72 6 6 6 
6 6 6 6 6 6 6 6 6 6 
6 6 89 6 6 6 6 345 6 6 
6 6 6 6 6 6 6 6 6 6 

Вы положить поперек и вниз чисел так, когда он читает целые числа в 2D массив, он знает, ширину и высоту.

Надеюсь, это помогло!

0

Это значительно быстрее, если вы используете MappedByteBuffer и читаете это как двоичный код и обрабатываете номера таким образом. В моих экспериментах в this similar context это было в три раза быстрее. Существует огромные накладные расходы для чтения построчно, в двух отношениях:

  1. сборщика мусор сходит с ума, потому что вы создаете и отбрасывая так много String объектов.
  2. Вы обрабатываете каждый символ дважды: один раз при построении String, а затем еще раз при переводе его в числа. Если вы разделите String, а затем преобразуете каждый из них, вы обрабатываете каждый символ три раза.

Это зависит скорее от того, хотите ли вы скорость, или краткость и простой код. Нет сомнений в том, что подход String легче понять, поэтому лучше, если вы знаете, что ваш файл всегда будет небольшим; но если это может стать огромным, вам стоит взглянуть на двоичный подход.

0

Возможно, я неправильно понял вопрос, но почему бы вам просто не прочитать его так?

list1 = [map(int,x.strip().split()) for x in open("/ragged.txt")] 

for z in list1: 
    for y in z: 
     print y, 
    print 

Он печатает следующие целые числа (такие же, как содержимое файла):

1 4 6 
2 3 
5 8 9 4 
2 1 
1 

Он работает для длинных целых чисел тоже.

Смежные вопросы