将文本文档中的元素存储到地图Java中

时间:2014-09-23 05:05:35

标签: java arraylist hashmap

所以我有一个名为stock.txt的文本文档,其中包含以下内容:

AAPL; Apple Inc.
IBM; International Business Machines Corp.
KO; The Coca-Cola Company
FB; Facebook Inc.
SBUX; Starbucks Corp.

我想将每个元素存储到一个HashMap中,股票代码作为关键字,公司名称作为项目。我最初尝试将所有内容存储在ArrayList中,但是当我想要打印出一行时,例如:

AAPL;Apple Inc.

我愿意:

System.out.println(array.get(0));

它会给我输出:

APPL;Apple

并打印array.get(1)会给我" Inc。"部分。

所以我的首要问题是如何确保我可以在HashMap中正确存储这些内容,以便我可以获得整个字符串" Apple Inc."成为地图的一部分。 谢谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

     InputStream stream=new FileInputStream(new File("path"));
     BufferedReader reader=new BufferedReader(new InputStreamReader(stream));
     String line;
     String tok[];
     Map<String, Object> map=new HashMap<String, Object>();
     while((line=reader.readLine())!=null){
         tok=line.split(";");
         map.put(tok[0].trim(), tok[1].trim());
     }
     System.out.println(map);

上面的代码从特定路径读取文件,并从;字符中拆分读取行并将其存储到map

希望它有所帮助。

答案 1 :(得分:0)

没有理由不能将信息存储到ArrayList中。缺少的数据更多地与您阅读和处理文件的方式有关,而不是与存储文件的结构有关。话虽如此,使用HashMap将允许您分别存储线的两个部分,同时保持它们之间的链接。 ArrayList方法不保留该链接 - 它只是一个有序列表。

这就是我要做的,这与Darshan的方法类似(你需要Java 1.7 +):

public HashMap<String, String> readStockFile(Path filePath, Charset charset)
{
  HashMap<String, String> map = new HashMap<>();

  try (BufferedReader fileReader =
        Files.newBufferedReader(filePath, charset))
  {
    final int STOCK_CODE_GROUP = 1;
    final int STOCK_NAME_GROUP = 2;
    /*
     * Regular expression - everything up to ';' goes in stock code group,
     * everything after in stock name group, ignoring any whitespace after ';'.
     */
    final Pattern STOCK_PATTERN = Pattern.compile("^([^;]+);\s*(.+)$");

    String nextLine = null;
    Matcher stockMatcher = null;

    while ((nextLine = reader.readLine()) != null)
    {
      stockMatcher = STOCK_PATTERN.matcher(nextLine.trim());

      if (stockMatcher.find(0))
        if (!map.containsKey(stockMatcher.group(STOCK_CODE_GROUP)))
          map.put(stockMatcher.group(STOCK_CODE_GROUP),
                  stockMatcher.group(STOCK_NAME_GROUP));
    }
  }
  catch (IOException ioEx)
  {
    ioEx.printStackTrace(System.err);  // Do something useful.
  }

  return map;
}

如果您希望将插入顺序保留在地图中,请将HashMap替换为LinkedHashMap。正则表达式(Pattern和Matcher)属于java.util.regex包,而Path和Charset分别位于java.nio.file和java.nio.charset中。您需要使用Path.getRoot()Path.resolve(String filePath)Charset.forName(String charset)来正确设置您的参数。

如果您遇到格式不正确的行或文件在文件中出现两次,您可能还需要考虑如何处理。这些将对两个'ifs'形成'else'条款。