【问题标题】:Trying to read a txt file and store it into an array list within a multi-value hash-map尝试读取 txt 文件并将其存储到多值哈希图中的数组列表中
【发布时间】:2016-06-16 12:46:04
【问题描述】:

我有一个文本文件,它看起来像这样:

gui awtui   swingui
swingui runner  extensions
textui  runner  framework
awtui   runner
runner  framework
extensions  framework

它们由标签分隔

我使用哈希映射存储这些,其中键是第一行,值是该行中的其余字符,例如 键 = gui 值 = atwui swingui

因此,我使用一键多值哈希映射来实现这一点,这就是我目前所做的。

import java.util.*;
import java.io.*;

public class PackageAnalyser {

public static void main(String[] args) throws IOException{
    HashMap<String, List<String>> dependencies = new HashMap<String, List<String>>();
        List<String> pack = new ArrayList<String>();    
        try (Scanner in = new Scanner(new File(args[0]))){
            //String line = null;
            while ((in.hasNext() )){
                String [] packs = in.nextLine().split("\t");
                for (int i = 0; i < packs.length; i++){
                    pack.add(packs[i]);
                    Arrays.sort(packs);
                } 
                dependencies.put(packs[0], pack);
                }

            }catch (IOException ex){
                System.err.println(ex);
            } finally {
        }System.out.println(dependencies);
    }
}

在多次尝试修改代码后,这是我运行时的输出样子

`{awtui = [awtui, swingui, runner, swingui, runner, textui, runner, framework, framework], framework=[awtui, swingui, runner, swingui, textui, runner, framework, framework], extensions=[awtui, swingui, runner, swingui, runner, textui, runner, framework, framework]}

我想要的输出是:

{gui = [awtui, swingui], swingui = [runner, extensions], textui =[runner, framework], awtui = [runner], runner = [framework], extensions = [framework]}

如图所示,我正在从文本文件中读取,并且我想显示为上面的输出所示。请帮忙。

【问题讨论】:

    标签: java arraylist hash key


    【解决方案1】:
    public class PackageAnalyser {
    
        public static void main(String[] args) throws IOException {
            HashMap<String, SortedSet<String>> dependencies = new HashMap<String, SortedSet<String>>();
    
            try (Scanner in = new Scanner(new File(args[0]))) {
                while ((in.hasNext())) {
                    String[] packs = in.nextLine().split("\\s");
                    String key = packs[0];
    
                    SortedSet<String> deps = dependencies.get(key);
                    if (deps == null) {
                        deps = new TreeSet<String>();
                        dependencies.put(key, deps);
                    }
    
                    for (int i = 1; i < packs.length; i++) {
                        if (!packs[i].equals("")) {
                            deps.add(packs[i]);                 
                        }
                    }                
                }
    
            } catch (IOException ex) {
                System.err.println(ex);
            } finally {
            }
            System.out.println(dependencies);
        }
    }
    

    {extensions=[framework], textui=[framework, runner], gui=[awtui, swingui], swingui=[extensions, runner], awtui=[runner], runner=[framework]}

    如果要保留插入顺序,可以使用LinkedHashMap 而不是普通的HashMap

    【讨论】:

    • 谢谢。这些对我来说是java中的新主题,我会探索linkedhashmap :)
    【解决方案2】:

    首先,您将整个列表添加到您的值中,而不是丢弃第一个值。

    其次,扔掉或移动它。您正在对其进行排序,然后存储第一个值。这可能会打乱您的订单并使用错误的密钥。

    最后,pack 似乎永远不会被清除。在每个循环之后,pack 需要成为一个新的数组列表,或者清除它的值

    【讨论】:

      【解决方案3】:

      也许,您试图排序以保留读取顺序。但这里有一段相对较短的代码:

      package com.demo;
      
      import java.io.File;
      import java.io.FileNotFoundException;
      import java.util.Arrays;
      import java.util.HashMap;
      import java.util.LinkedHashMap;
      import java.util.List;
      import java.util.Scanner;
      
      public class PackageAnalyser {
      
          public static void main(String[] args){
      
              Scanner scanner = null;
      
              try {
                  scanner = new Scanner(new File(args[0]));
                  String line = null;
                  String[] lineParts = null;
      
                  HashMap<String, List<String>> dependencies = new LinkedHashMap<String, List<String>>();
      
                  while(scanner.hasNextLine()){
                      line = scanner.nextLine();
                      lineParts = line.split("\\s+");
      
                      dependencies.put(lineParts[0], Arrays.asList(Arrays.copyOfRange(lineParts, 1, lineParts.length)));
                  }
      
                  System.out.println(dependencies);
      
              } catch (FileNotFoundException e) {
                  System.err.println(e.getMessage());
              } finally {
                  scanner.close();
              }
          }
      }
      

      给予

      {gui=[awtui, swingui], swingui=[runner, extensions], textui=[runner, 框架],awtui=[跑步者],跑步者=[框架], 扩展=[框架]}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        相关资源
        最近更新 更多