【问题标题】:Read a file and map to a Map<String, List<String>>读取文件并映射到 Map<String, List<String>>
【发布时间】:2016-06-12 10:33:40
【问题描述】:

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

X - Y

A - B

X - Z

A - C

X - L

A - N

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

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

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


我认为存储它们的最佳方式是Map&lt;String, List&lt;String&gt;&gt;

我想到了以下算法:

  • 使用Files.readAllLines() 读取传入文件以将行存储为List&lt;String&gt;
  • 使用String.split()StringTokenizer 将行标记为List&lt;List&lt;String&gt;&gt;

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

提前致谢!

【问题讨论】:

  • 试试你自己的算法,看看它是否有效,如果你有问题回来,我们会提供帮助。
  • 你快到了,将行中的第一个元素用作地图的键,并将 split[1...N] 的其余部分添加到地图中,并使用此键作为值

标签: java list hashmap tokenize


【解决方案1】:

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

    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());

【讨论】:

  • 仅供参考,如果您希望每个键的值是唯一的,您可以使用 Map>
  • pairs.put(key, valueFromMap);直接放在valueFromMap = new ArrayList&lt;&gt;();后面不是更好吗?
【解决方案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]}

【讨论】:

    【解决方案3】:
    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]}

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      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]}

      【讨论】:

        猜你喜欢
        • 2019-11-27
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 2018-12-07
        • 2019-10-01
        • 2023-03-23
        • 2010-10-25
        • 2014-06-25
        相关资源
        最近更新 更多