读取由制表符分隔的文件,并将单词放在ArrayList中

我正在做一个自学练习,以帮助我更多地了解Java,但我坚持这个问题。 我有以下txt文件:

Name Hobby Susy eat fish Anna gardening Billy bowling with friends 

注意: 名称和爱好由制表符分隔

读取所有行并将其放入arraylist(名称,爱好)的最佳方法是什么。 棘手的部分是

 eat fish or bowling with friends 

有空格,它必须放在一个arrays下,显然我不能硬编码。 这是我目前的代码:

  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 names = new ArrayList(); ArrayList hobbies = new ArrayList(); String lineJustFetched; while ((lineJustFetched = br.readLine()) != null) { String[] tokens = lineJustFetched.split(" \t"); 

我收到一个错误:

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

我怀疑计算索引在选项卡上不是很有用。 任何想法?

好的,你需要做下面显示的配方:

  1. 创建一个BufferedReader
  2. 创建一个ArrayList
  3. 开始将数据读入名为lineJustFetchedString变量中。
  4. 通过调用lineJustFetched.split("\t");拆分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 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 

如果您使用tab \t分隔Name和Hobby列,则应该执行以下操作(并且不要忘记在结束时关闭扫描):

 public void readFile() throws FileNotFoundException{ Scanner scan = new Scanner(new File("D://a.txt")); ArrayList names = new ArrayList(); ArrayList hobbies = new ArrayList(); 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(); } 

对于仍然磕磕绊绊的其他人。

使用Stream API(Java 8),可以这样做

由此可见

  • 过滤方法从列表中过滤第一个标题元素
  • map方法将流中的每个元素映射到新流的另一个元素。
 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 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 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} 

你应该试试commons-lang库。 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’);

假设比利和保龄球之间有标签,y [0]包含“比利”y [1]包含“与朋友保龄球”

在解析选项卡时,为了将来引用,有一个分隔符,例如“\ t”用于制表符。 用它来代替.split(“”)

此外,当你的错误被抛出,因为它意味着没有找到字符,因此-1,所以当你尝试将它存储在一个数组中时… -1无效。 (扔一张支票)

根据您的IDE,您可以逐步抛出程序F10或F11 ..或其他一些键

只是一些提示