【问题标题】:Store variables correctly in an ArrayList during a loop在循环期间将变量正确存储在 ArrayList 中
【发布时间】:2015-10-02 07:55:28
【问题描述】:

我在数组列表中存储变量时遇到了一些问题。该程序的建议是从一个文件(A)中读取,读取另一个文本文件(B),然后比较B中A中出现的词汇量的百分比。因此,我将每个出现的单词都存储在neuS。问题来了。如果我尝试获取输出,它似乎将值随机存储在里面!例如,我得到如下输出:

elektrotechnik und
die bedeutendste
die bedeutendste
und simulation
erleben die
eine form
eine form

所以有一些词(正确地说是 Ngramms,因为我总是将两个词一起存储),在 neuS 中只有一次,而其他的只有一次。我也看到了三倍相同的输出。我希望所有单词只在 neuS 中存储一次。我在做什么错?代码不完整,我认为有些代码与此问题无关。

谢谢!

BufferedReader in = new BufferedReader(new FileReader("informatik_test.txt"));
String str;

// 
while ((sCurrentLine = in.readLine()) != null) {
    // System.out.println(sCurrentLine);
    arr = sCurrentLine.split(" ");
    for (int i = 0; i < arr.length - 1; i = i + 2) {
        String s = (arr[i].toString() + " " + arr[i + 1].toString())
                .toLowerCase();
        if (null == (hash.get(s))) {
            hash.put(s, 1);
        } else {
            int x = hash.get(s) + 1;
            hash.put(s, x);
        }
    }
    //

    ArrayList< String> words = new ArrayList< String>();
    ArrayList< String> neuS = new ArrayList< String>();
    ArrayList< Long> neuZ = new ArrayList< Long>();

    // Read all Lines from a file
    for (String line = br.readLine(); line != null; line = br.readLine()) {
        String h[] = line.split("   ");

        words.add(h[0].toLowerCase());

    }
    //
    for (String x : hash.keySet()) {
        summe = summe + hash.get(x);
        long neu = hash.get(x);
        for (String s : words) {

            if (x.equals(s)) {
                neuS.add(x);
                neuZ.add(neu);
                disc = disc + 1;
            }

        }
    }
    // Testing which word for output -->! THE PROBLEM!!
    for (String m : neuS) {
        System.out.println(m);
    }

}

【问题讨论】:

  • 什么样的对象是'hash'? (hash.put(s, 1);)
  • 一定是HashMap,看看使用的方法。
  • 是的,它是一个 HashMap!

标签: java loops arraylist store


【解决方案1】:

如果你希望 neuS 中的单词只存储一次,那么 neuS 应该是一个 HashSet。事实上,因为words 和neuS 都是数组,所以如果单词包含重复项,neuS 也会包含重复项。

旁注:对于String h[] = line.split(" ");,拆分中有 2 个空格。这是故意的吗?

【讨论】:

  • YES :) 如果我使用它,它会起作用。但是 HashSet 是如何工作的呢?是否将这些行平等地添加到 neuZ 中,因为我需要存储所有这些行,因为稍后我会对这些值求和。那么 neuS 作为 HashSet 和 neuZ 作为 ArrayList 会得到正确的百分比吗?是的,拆分是来自我的数据的结构;)
  • Java 中的所有集合确保对象在其中只出现一次。 HashSet 通过散列实现这一点,这通常比创建集合的常见替代方法更有效:通过树。我建议阅读有关数据结构的信息,例如集合和列表,以及散列。
【解决方案2】:

你可以把 neuS 变成一个 HashSet。它会修复你的输出。

【讨论】:

    【解决方案3】:
    for (String s : words) { 
        if (x.equals(s)) {
            neuS.add(x);
            neuZ.add(neu);
            disc = disc + 1;
        }
    }
    

    你应该在disc = disc + 1;之后添加break;,并且你应该在添加之前检查x是否在neuS中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2022-07-21
      • 2012-04-12
      • 2012-09-29
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多