我仍在开发此代码的过程中,我正在寻找以高效和紧凑的方式执行此操作的想法,因为我打算将其嵌入到单独的Java代码中。虽然我更喜欢HashMap或ArrayList方法,但我对其他方法的想法持开放态度
我有一个我正在使用的文件,如下所示:
053 100% BRAN A0 B1 C01 E0
054 100% NATURAL A0 B1 C01 E0 F0 G0
这段代码的最终产品必须看起来像
053 016% BRAN A0
053 100% BRAN B1
053 100% BRAN C01
053 100% BRAN E0
054 100% NATURAL A0
054 100% NATURAL B1
054 100% NATURAL C01
054 100% NATURAL E0
054 100% NATURAL F0
054 100% NATURAL G0
请注意,该文件非常大。所有列都是制表符分隔的,最后一列是空格分隔的元素。
编辑:我很抱歉我应该更好地构建我的问题。我正在考虑集合,因为在这之后我需要能够访问具有不同键的所有行(第一列的重复值)。
如果模式是固定的,那么可以使用RegEx完成。 get();
将每行作为输入并返回该输入字符串的所有组合的列表
public static void main(String[] args) {
String input="053 100% BRAN A0 B1 C01 E0";
System.out.println(get(input));
}
public static List<String> get(String input){
List<String> list = new ArrayList<String>();
String regEx="((?:\\d*)\\s(?:\\d*)%\\s(?:[A-Z]*))([\\s]*)([\\sA-Z0-9]*)";
Matcher matcher = Pattern.compile(regEx).matcher(input);
String firstHalf="";
String codes="";
if(matcher.matches()) {
firstHalf=matcher.group(1)+matcher.group(2);
codes=matcher.group(3);
}
for (String code : codes.split("\\s")) {
list.add(firstHalf+code);
}
return list;
}
目前还不清楚为什么你需要一个系列。只需操纵字符串:
for (String line : input) {
String prefix = line.substring(0, 20); // Or however you decide on the line prefix.
String suffix = line.substring(20);
for (String part : suffix.split(" ")) {
System.out.printf("%s%s%n", prefix, part);
}
}
你可以通过使用PrintWriter
来避免显式构造子串/拆分数组,从而比这更有效。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Test {
public static void main (String[] args){
List<String[]> myList = new ArrayList<>();
//read each line of your file and split it by \s+
try (Stream<String> stream = Files.lines(Paths.get("C:\\temp\\xyz.txt"))) {
stream.forEach( line->{
String[] splited = line.split("\\s+");
//iterate from 4th element of your splited array to last
//and add the first three elements and the ith element to your list
for(int i = 3; i<splited.length; i++){
myList.add(new String [] {splited[0] ,splited[1], splited[2], splited[i]});
}
});
} catch (IOException ex) {
ex.printStackTrace();
}
//print or do other stuff with your list
myList.forEach(e->{System.out.println(Arrays.toString(e));});
}
}