这是我创建的代码。它按照我想要的方式工作,但我认为它可以更简单。
File test = new File("test.txt");
try{
Scanner input = new Scanner(test);
int[] testInt= new int[100];
String[] test= new String[100];
String[] print= new String[100];
int i= 0;
while(input.hasNextLine()){
test[i] = input.nextLine();
String[] temp = test[i].split(":");
testInt[i] = Integer.parseInt(temp[1]);
print[i] = temp[0];
i++;
}
for(int j=0; j<i; j++)
System.out.println(print[j] + ":" + testInt[j]);
} catch (FileNotFoundException ex){
System.out.println("File not found!");
}
以下是&#34; test.txt&#34;的内容:
Telur Dadar:40
Maggi Goreng:50
所需的输出类似于test.txt
中的内容,只是整数值以int数据类型存储。不知何故,我认为有一种方法可以使用nextInt()
和分隔符等。
我尝试过使用nextInt()
和一些客户分隔符,但我得到的却是很多错误。
有任何建议怎么做?
答案 0 :(得分:2)
您可以使用Java 8功能执行此操作,如下所示
package example;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class SplitFile {
public static void main(String[] args) throws IOException {
List<Integer> numbers = new ArrayList<Integer>();
List<String> names = new ArrayList<String>();
try (Stream<String> stream = Files.lines(Paths.get("test.txt"))) {
stream.forEach(s -> {
names.add(s.split(":")[0]);
numbers.add(Integer.parseInt((s.split(":"))[1].trim()));
});
}
IntStream.range(0, Math.min(names.size(), numbers.size()))
.mapToObj(i -> names.get(i) + ":" + numbers.get(i))
.forEach(System.out::println);
}
}
输出:
Telur Dadar:40
Maggi Goreng:50
答案 1 :(得分:0)
我建议你从一个例程开始,用正则表达式计算匹配行的数量。另外,您应该close
Scanner
读取文件(因此您不会泄漏文件句柄)。最简单的可能是try-with-resources
和类似&#34; ^ \ D +:\ d +&#34;它匹配连续的字母字符,然后是:
,然后是连续的数字,如
public static int countLines(File f) {
int c = 0;
try (Scanner s = new Scanner(f)) {
while (s.hasNextLine()) {
String line = s.nextLine();
if (line.matches("^\\D+:\\d+")) {
c++;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return c;
}
然后,您可以创建一个例程来填充数组(使用您的行Scanner
),如
public static void readLines(File f, int[] nums, String[] vals) {
int c = 0;
try (Scanner s = new Scanner(f)) {
while (s.hasNextLine()) {
String line = s.nextLine();
if (line.matches("^\\D+:\\d+")) {
Scanner input = new Scanner(line).useDelimiter(":");
vals[c] = input.next();
nums[c] = input.nextInt();
c++;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
最后,您的main
方法可能如下(假设test.txt
位于用户的主文件夹中),我还建议使用printf
格式化io并重命名变量print
和testInt
至vals
和nums
赞,
public static void main(String[] args) {
File test = new File(System.getProperty("user.home"), "test.txt");
int lineCount = countLines(test);
int[] nums = new int[lineCount];
String[] vals = new String[lineCount];
readLines(test, nums, vals);
for (int j = 0; j < lineCount; j++) {
System.out.printf("%s:%d%n", vals[j], nums[j]);
}
}
我得到了
Telur Dadar:40
Maggi Goreng:50
答案 2 :(得分:0)
以下是使用地图删除数组的方法。这将根据您的数据自动调整大小。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication2;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
*
* @author dciborow
*/
public class JavaApplication2 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
String file = "";
try (Stream<String> stream = Files.lines(Paths.get("test.txt"))) {
stream.forEach(s -> {
String[] split = s.split(":");
map.put(split[0], Integer.parseInt(split[1]));
});
} catch (IOException ex) {
Logger.getLogger(JavaApplication2.class.getName()).log(Level.SEVERE, null, ex);
}
map.keySet().stream().forEach(s -> System.out.println(s + ": " + map.get(s)));
}
}
答案 3 :(得分:0)
使用java8的简短测试解决方案
Path path = Paths.get(ClassLoader.getSystemResource("file.txt").toURI());
Map<String, Integer> collect = Files.lines(path)
.map(line -> line.split(":"))
.collect(Collectors.toMap(lineArray -> lineArray[0], lineArray -> Integer.parseInt(lineArray[1])));
您可以使用任何提供字符串流(行)的方法代替Files.lines(path)
。 map
操作将行转换为String [](第一项=名称,secont项目=数字)。收集使用toMap collector,需要两个函数 - 一个用于键,一个用于值。收集器使用上一步中的String []。