读取文件并映射到Map <string,list <string =“”>&gt;

时间:2016-06-12 10:33:40

标签: java list hashmap tokenize

所以,我有一个以下列方式编写的文件:

X - Y

A - B

X - Z

A - C

X - L

A - N

基本上,两个实体之间存在关系。

我想将其映射到地图上,以便可以将一个唯一键映射到值列表中。

我想要的是这样的: {X = [Y,Z,L]},{A = [B,C,N]}等......

我认为存储它们的最佳方式是Map<String, List<String>>

我记住了以下算法:

  • 使用Files.readAllLines()读取传入的文件,将这些行存储为List<String>
  • 使用String.split()StringTokenizer将行标记为List<List<String>>

此后我该怎么办?我只需要一个算法,请注意,这不是家庭作业。我正在为自己编写一个简单的Java应用程序,用于对这些文件进行标记,并将它们导出为CSV格式。

提前致谢!

4 个答案:

答案 0 :(得分:5)

我的第一个想法是这样做:

    List<String> lines = new ArrayList<>(Arrays.asList("X - Y", "A - B", "X - Z", "A - C", "X - L", "A - N"));
    Map<String, List<String>> pairs = new HashMap<>();
    for (String line : lines) {
        String[] pair = line.split("-");
        String key = pair[0].trim();
        String val = pair[1].trim();
        List<String> valueFromMap = pairs.get(key);
        if(valueFromMap == null) {
            valueFromMap = new ArrayList<>();
        }
        valueFromMap.add(val);
        pairs.put(key, valueFromMap);
    }
    System.out.println(pairs.toString());

答案 1 :(得分:2)

以下是如何在Java 8中执行此操作:

System.out.println(
    Files.readAllLines(file).stream()
        .map(line -> line.split("-"))
        .collect(
            groupingBy(
                array -> array[0].trim(), 
                mapping(array -> array[1].trim(), 
                toList())
            )
        )
);

<强>输出:

{A=[B, C, N], X=[Y, Z, L]}

答案 2 :(得分:1)

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class prova {


    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Map<String,ArrayList<String>> mappa= new HashMap<String,ArrayList<String>>();

        File dir = new File(".");
        File fin = new File(dir.getCanonicalPath() + File.separator + "file.txt");

        FileInputStream fis = new FileInputStream(fin);

        //Construct BufferedReader from InputStreamReader
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));

        String line = null;
        while ((line = br.readLine()) != null) {
            String[] splitted = line.split(" - ");
            String key = splitted[0];
            String value = splitted[1];
            ArrayList<String> v;

                 v = mappa.get(key);

            if (v==null)
                v = new ArrayList<String>();

            v.add(value);
            mappa.put(key, v);
        }
        System.out.println(mappa.toString());
        br.close();
    }

}

我的输出是:{A = [B,C,N],X = [Y,Z,L]}

答案 3 :(得分:1)

你可以试试这个:

public static void main(String[] args) throws IOException {
    Map<String,List<String>> graphlist = new TreeMap<>();


    String path = "/Users/addodennis/Desktop/Projects/HotelReservation/src/Data/Dlist";
    String str;
    try(BufferedReader read = new BufferedReader(new FileReader(path));) {
        while ((str = read.readLine()) != null){

            String[] list = str.split(" - ");
            String k = list[0].trim();
            String v1 = list[1].trim();
            List<String> ad = graphlist.get(k);
            if (ad == null){
                ad = new ArrayList<>();
            }
            ad.add(v1);
            graphlist.put(k,ad);


        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }





}

代表A

  

{A = [B,C,N]}