【问题标题】:Reading from .txt and storing into Hashmap从 .txt 读取并存储到 Hashmap
【发布时间】:2011-12-29 05:41:04
【问题描述】:

我可以使用任何其他方法将分号分隔的字符串从 .txt 文件读入 Has 映射而不是 *sourceArra*y

 public static void main(String[] args) throws IOException {
    try {
        ArrayList<Synset> booleansynsets = null;
        ArrayList<Synset> booleanduplicatesynsets = null;
        Map<String, String> basebooleanentitieslist = new HashMap<String, String>();
        BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\Users\\anand\\Desktop\\updatedDuplicateBooleanEntitiesList-sorted.txt"));
        String line = "";
        while ((line = bufferedReader.readLine()) != null) {
            String[] sourceArray = line.split(";");
            basebooleanentitieslist.put(sourceArray[0],sourceArray[1]);
            System.out.println(line);
        }

// 更新后的

bufferedReader.toString();
        StringTokenizer st1 = new StringTokenizer(bufferedReader.toString(),";");
        while ((line = bufferedReader.readLine()) != null && st1.hasMoreTokens()) {
  //                String[] sourceArray = line.split(";");

            basebooleanentitieslist.put(st1.nextToken(";"), st1.nextToken());
            System.out.println(line);
        }

【问题讨论】:

  • 这种方法(当前)有什么问题?
  • 你的方法非常简单直接,过度优化只会让它变得复杂。
  • 目前的方法没问题,但是感觉它是否很长,我的意思是有没有办法在不使用 sourceArray 的情况下对其进行优化。
  • thanqu u guyz for you cmets.. 如果可以的话,请指导我如何使用 stringtokenizer 来做到这一点?

标签: java hashmap java-io


【解决方案1】:

目前的方法没有问题,但感觉它是否冗长,我的意思是有没有办法在不使用 sourceArray 的情况下优化它。

您没有说您要优化什么:性能?内存使用情况?可读性?

如果您担心性能,那么下一个问题是您的担心是否真的有道理。你运行你的应用程序了吗?是不是太慢了?您是否对其进行了分析并确定拆分行需要大量时间?

使用数组有什么特别的问题? (是的,我知道分配一个数组需要一些成本,但是你有任何证据表明这很重要吗?)


如果您正在尝试优化可读性,那么我会说使用 String.split 对于此示例可能更具可读性。 (许多 Java 程序员从未遇到/使用过StringTokenizer 类。)

如果您尝试优化性能/内存使用,那么StringTokenizer 值得尝试,但我不保证它会更快。另一种选择是直接使用PatternMatcher,如下:

    Pattern pattern = Pattern.compile("([^;]*);(.*)");
    while ((line = bufferedReader.readLine()) != null) {
        Matcher matcher = pattern.matcher(line)
        if (matcher.matches()) {
            basebooleanentitieslist.put(matcher.group(1), matcher.group(2));
        }
    }

(顺便说一句,about 代码将处理行不正常拆分的情况;即不抛出异常。如果您想显式处理它,请添加 else 子句。)

【讨论】:

  • thanx stephen...你对性能的解释很酷...我明白了...;)
【解决方案2】:

考虑使用StringTokenizer 类。

【讨论】:

  • 请仔细考虑您的新代码。您的原始代码几乎是正确的,您阅读了一行,然后将其拆分为标记。当您使用 StringTokenizer 时,您应该在使用 nextToken() 之前检查 hasToken(),因为如果令牌不存在并且您希望优雅地失败,您的输入中可能会出现一些错误。
【解决方案3】:

您可以使用StringTokenizer(或)拆分。

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多