读取由制表符分隔的文件,并将单词放在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
我怀疑计算索引在选项卡上不是很有用。 任何想法?
好的,你需要做下面显示的配方:
- 创建一个
BufferedReader
- 创建一个
ArrayList
- 开始将数据读入名为
lineJustFetched
的String
变量中。 - 通过调用
lineJustFetched.split("\t");
拆分String
lineJustFetched.split("\t");
- 迭代生成的
String[]
。 检查要输入ArrayList
的令牌是否不是""
- 如果没有,请将该单词添加到
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 ..或其他一些键
只是一些提示
- SwingWorker ProgressBar
- 使用Java修改文件的内容
- 如何通过FileWriter在BufferedWriter上设置缓冲区大小
- Java FileInputStream ObjectInputStream到达文件结尾EOF
- 如何将文本文件内容导入Java应用程序中的JTextArea?
- Stream上的收集操作是否关闭流和底层资源?
- 为什么输出没有打印在Servlet的WEB-INF文件夹下名为EmailList.txt的文件中
- Files.readAllBytes vs Files.lines获取MalformedInputException
- 将jTextArea(即另存为)中的文本保存到新的.txt文件中