使用ArrayLists和HashMaps在Java中进行紧凑拆分和新行操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ArrayLists和HashMaps在Java中进行紧凑拆分和新行操作相关的知识,希望对你有一定的参考价值。

我仍在开发此代码的过程中,我正在寻找以高效和紧凑的方式执行此操作的想法,因为我打算将其嵌入到单独的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));});
    } 

}

以上是关于使用ArrayLists和HashMaps在Java中进行紧凑拆分和新行操作的主要内容,如果未能解决你的问题,请参考以下文章

Java中的HashMaps - 索引与否

java 使用hasNext()方法的ArrayLists和比较

java 使用Hashmaps检查Anagrams

在处理 ArrayLists 时,我用啥代替 charAt?

使用 arraylists 得到错误的输出

使用方法在 ArrayLists 中循环