2013-10-24 3 views
9

Я занимаюсь самообучением, чтобы помочь мне больше узнать о Java, но я застрял в этом вопросе. У меня есть следующий текстовый файл:Прочтите файл, разделенный вкладкой, и поместите слова в ArrayList

Name Hobby 
Susy eat fish 
Anna gardening 
Billy bowling with friends 

Примечание: имя и хобби разделены табуляцией

Что является лучшим способом, чтобы прочитать всю строку и поместить его в ArrayList (имя, хобби). Хитрость в том, что

eat fish or bowling with friends 

имеет пробелы и должен быть помещен под один массив и, очевидно, я не могу это жёстко. Вот мой текущий код:

public void openFile(){ 
      try{ 
       FileInputStream fstream = new FileInputStream("textfile.txt"); 
      // use DataInputStream to read binary NOT text 
      BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
      ArrayList<String> names = new ArrayList<String>(); 
      ArrayList<String> hobbies = new ArrayList<String>(); 
      String lineJustFetched; 
      while ((lineJustFetched = br.readLine()) != null) { 
      String[] tokens = lineJustFetched.split(" \t"); 

Я получил сообщение об ошибке:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

Я подозреваю подсчета индекса не очень полезно на вкладке. Любая идея?

+0

Убедитесь, что никакие новые/пустая строка не присутствует в конце файла. – srkavin

ответ

7

Хорошо, что вам нужно сделать рецепт ниже:

  1. Создать BufferedReader
  2. Создать ArrayList<String>
  3. Начать чтение данных в String переменную с именем lineJustFetched.
  4. Разделить String по телефону lineJustFetched.split("\t");
  5. итерации по String[] производства. Проверьте, если маркер вы хотите, чтобы войти в ArrayList не ""
  6. Если нет, добавьте слово в ArrayList

Вы указываете, что вам нужно разделить на основе \t значений так пробельные не будет вопрос.

SSCCE

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.util.ArrayList; 

public class WordsInArray { 
    public static void main(String[] args) { 
     try{ 
      BufferedReader buf = new BufferedReader(new FileReader("/home/little/Downloads/test")); 
      ArrayList<String> words = new ArrayList<>(); 
      String lineJustFetched = null; 
      String[] wordsArray; 

      while(true){ 
       lineJustFetched = buf.readLine(); 
       if(lineJustFetched == null){ 
        break; 
       }else{ 
        wordsArray = lineJustFetched.split("\t"); 
        for(String each : wordsArray){ 
         if(!"".equals(each)){ 
          words.add(each); 
         } 
        } 
       } 
      } 

      for(String each : words){ 
       System.out.println(each); 
      } 

      buf.close(); 

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

Выход

John 
likes to play tennis 
Sherlock 
likes to solve crime 
+0

hi ive редактировать мой исходный код, как вам было поручено .. это правильно? – user2891092

+0

@ user2891092 Я отправил вам SSCCE. –

+0

, но он поместил все в один аррайалист. можно ли разделить их на двух арраистов (например, john помещается в имена и любит играть в теннис, увлекается хобби)? – user2891092

0

Вы должны попробовать библиотеку Обще-языки. http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/index.html Среди многих других полезных вещей, которые вы можете разбить строку, используя разделитель:

String x="Billy bowling with friends";

String y[]=StringUtils.split(x, '\t');

Предполагая, что есть, как вкладки между Билли и боулинг, у [0] содержит «Билли» у [1] содержит " боулинг с друзьями "

0

Для будущих ссылок, когда вы просматриваете вкладку, для вкладки есть разделитель, такой как« \ t ». Используйте это вместо.split ("")

Также, когда вы ошиблись, потому что это означает, что символ не найден, следовательно, -1, поэтому при попытке сохранить его в массиве ... -1 недопустим. (Бросить в чек на что)

Вы можете шаг бросить вашу программу F10 или F11..or какой-то другой ключ в зависимости от вашего IDE

Просто некоторые советы

2

Если отдельное название и хобби колонки вкладка \t, вы должны сделать что-то вроде этого (и не забудьте закрыть сканирование в конце):

public void readFile() throws FileNotFoundException{ 
    Scanner scan = new Scanner(new File("D://a.txt")); 
    ArrayList<String> names = new ArrayList<String>(); 
    ArrayList<String> hobbies = new ArrayList<String>(); 

    while(scan.hasNext()){ 
     String curLine = scan.nextLine(); 
     String[] splitted = curLine.split("\t"); 
     String name = splitted[0].trim(); 
     String hobby = splitted[1].trim(); 
     if(!"Name".equals(name)){ 
      names.add(name); 
     } 
     if(!"Hobby".equals(hobby)){ 
      hobbies.add(hobby); 
     } 
    } 
    System.out.println(names); 
    System.out.println(hobbies); 
    scan.close(); 
} 
1

для других все еще наткнуться на это.

Использование Stream API (Java 8), это может быть сделано, как

Это показывает

  • метод фильтра для фильтрации первого элемента заголовка из списка
  • метода карты для отображения каждого элемента в поток в другой элемент для нового потока.
package com.bhavya.stackoverflow.examples.q19575308; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.function.Predicate; 

/** 
* Java 8 Stream API to handle file reading. 
* 
* @author bhavya.work 
*/ 
public class StreamTests { 
    public static void main(String[] args) { 
    try { 
     InputStream fileInputStream; 
     BufferedReader bufferedReader; 
     final String filepathInSamePackage = "textfile.txt"; 
     //filter predicate 
     Predicate<String> filterFirstLine = 
      line -> !(
       "Name".equals(line.split("\t", -1)[0]) 
        && "Hobby".equals(line.split("\t", -1)[1]) 
     ); 

     //Implementation 1 returns Arrays as asked. 

     System.out.println("==ArrayList=="); 
     fileInputStream = StreamTests.class.getResourceAsStream(filepathInSamePackage); 
     bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); 

     bufferedReader 
      .lines() 
      .filter(filterFirstLine) 
      .map(s -> { 
      String[] splitStrings = s.split("\t", -1); 
      return Arrays.asList(splitStrings); 
      }).forEach(System.out::println); 

     //Implementation 2 returns HashMap as another example 

     fileInputStream = StreamTests.class.getResourceAsStream(filepathInSamePackage);  
     bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); 
     System.out.println("\n==HashMap=="); 

     bufferedReader 
      .lines() 
      .filter(filterFirstLine) 
      .map(s -> { 
      String[] splitStrings = s.split("\t", -1); 
      HashMap<String, String> stringStringMap = new HashMap<>(); 
      stringStringMap.put(splitStrings[0], splitStrings[1]); 
      return stringStringMap; 
      }).forEach(System.out::println); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

И выход

==ArrayList== 
[Susy, eat fish] 
[Anna, gardening] 
[Billy, bowling with friends] 

==HashMap== 
{Susy=eat fish} 
{Anna=gardening} 
{Billy=bowling with friends} 
Смежные вопросы