我有以下文本文件(answers.txt):
问题 A:23|47|32|20
问题 B:40|50|30|45
问题 C:5|8|11|14
问题 D:20|23|25|30
我需要的是能够读取我告诉它的问题(问题 A,问题 B),然后读取它后面的数字,这些数字由行分隔,并像这样打印出来:
问题 A 的答案:a.23 b.47 c.32 d.20
有谁知道如何做到这一点?我已经坚持了一段时间。
逐行阅读,首先在“ ”处拆分行。您将得到一个包含“问题”、“A:”和“23|47|32|20”三部分的数组。然后在“|”处拆分第三部分 所以你会得到第二个数组,它有四个部分“23”、“47”、“32”、“20”。
结合所有以获得您想要的输出。
如果您想了解如何从文件中读取行或溢出的字符串,那么网上有数十亿的教程介绍了如何做到这一点,所以我不会详细介绍它是如何完成的。我相信你能找到他们。
看看这段代码!它假设你有这样的文件格式:
Problem A:
23|7|32|20
Problem B:
40|50|30|45
Problem C:
5|8|11|14
Problem D:
20|23|25|30
因为你写了“后面的数字,由行分隔”
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) throws FileNotFoundException {
Scanner sc = new Scanner(new File("answers.txt"));
List<String> dataList = new ArrayList<String>();
while(sc.hasNextLine()){
dataList.add(sc.nextLine());
}
System.out.println(dataList);
Map<String,String> map = new HashMap<String,String>();
for(int i=0;i<dataList.size();i=i+2){
map.put(dataList.get(i),dataList.get(i+1));
}
for(Entry<String,String> en:map.entrySet()){
System.out.println(en.getKey()+" : "+en.getValue());
}
String problemC = map.get("Problem C:");
String splitted[] = problemC.split("\\|");
System.out.println("Get me problem C: "+String.format("a:%s, b:%s, c:%s, d:%s",splitted[0],splitted[1],splitted[2],splitted[3]));
}
}
假设在您的示例中总是有四个可能的答案:
// read complete file in fileAsString
String regex = "^(Problem \\w+): (\\d+)\\|(\\d+)\\|(\\d+)\\|(\\d+)$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(fileAsString);
//and so on, read all the Problems using matcher.find() and matcher.group(int) to get the parts
// put in a Map maybe?
// output the one you want...
逐行阅读,用:
. 您将得到一个包含两部分“问题 A:”和“23|47|32|20”的数组。然后在“|”处拆分第二部分 所以你会得到第二个数组,它有四个部分“23”、“47”、“32”、“20”。
结合所有这些,您将获得所需的输出。
干杯!
我可能会建议为组织目的创建一个简单的数据类型:
public class ProblemAnswer {
private final String problem;
private final String[] answers;
public ProblemAnswer(String problem, String[] answers) {
this.problem = problem;
this.answers = new String[answers.length];
for (int i = 0; i < answers.length; i++) {
this.answers[i] = answers[i];
}
}
public String getProblem() {
return this.problem;
}
public String[] getAnswers() {
return this.answers;
}
public String getA() {
return this.answers[0];
}
public String getB() {
return this.answers[1];
}
public String getC() {
return this.answers[2];
}
public String getD() {
return this.answers[3];
}
}
然后从文本文件中读取的内容如下所示:
public void read() {
Scanner s = new Scanner("answers.txt");
ArrayList<String> lines = new ArrayList<String>();
while (s.hasNext()) {
lines.add(s.nextLine());//first separate by line
}
ProblemAnswer[] answerKey = new ProblemAnswer[lines.size()];
for (int i = 0; i < lines.size(); i++) {
String[] divide = lines.get(i).split(": "); //0 is the problem name, 1 is the list
//of answers
String[] answers = divide[1].split("|"); //an array of the answers to a given
//question
answerKey[i] = new ProblemAnswer(divide[0], answers); //add a new ProblemAnswer
//object to the key
}
}
现在这给您留下了一个带有 ProblemAnswer 对象的答案键,可以通过对该方法的简单.equals()
比较轻松地检查它getProblem()
,并且无论匹配的索引是什么,您都可以将所有答案整齐地排列在同一个对象中。
使用java.util.Scanner
,您可以过滤文件中的整数。
Scanner s = new Scanner (new File ("answers.txt")).useDelimiter("\\s+");
while (s.hasNext()) {
if (s.hasNextInt()) { // check if next token is integer
System.out.print(s.nextInt());
} else {
s.next(); // else read the next token
}
}
你知道如何逐行阅读吗?如果没有,请检查如何在 java 中逐行读取大文本文件?
要子您的字符串数据,有很多方法可以做。您可以根据需要进行分装。这是我的代码..
String data = yourReader.readLine();
String problem = data.substring("Problem".length(), data.indexOf(":"));
System.err.println("Problem is " + problem);
data = data.substring(data.indexOf(":") + 2, data.length());
String[] temp = data.split("\\|");
for (String result : temp) {
System.out.println(result);
}
希望这可以帮助!
public static void main(String args[])
{
BufferedReader br = new BufferedReader(new FileReader(new File("answers.txt")));
String lineRead = null;
String problem = "Problem A";//Get this from user Input
List<String> numberData = new ArrayList<String>();
while((lineRead = br.readLine())!=null)
{
if(lineRead.contains(problem))
{
StringTokenizer st = new StringTokenizer(lineRead,":");
String problemPart = st.nextToken();
String numbersPart = st.nextToken();
st = new StringTokenizer(lineRead,"|");
while(st.hasMoreTokens())
{
String number = st.nextToken();
System.out.println("Number is: " + number);
numberData.add(number);
}
break;
}
}
System.out.println("Answers for " + problem + " : " + numberData );
}