【问题标题】:Using the class methods of something in a TreeMap在 TreeMap 中使用某些东西的类方法
【发布时间】:2013-03-26 22:12:23
【问题描述】:

我知道已经有关于这件事的主题,但没有一个真正回答我的问题。有没有办法做到这一点? 如果我有一个使用字符串作为键并将 TreeSet 类的对象作为值的 TreeMap,有没有办法可以将一些 int 添加到与特定键关联的集合中?

我应该做的是使用 TreeMap 和 TreeSet 类从文本文件中进行索引。我的计划是使用 TreeMap 键作为文本文件中的单词,值将是单词出现的行号集。因此,您逐步浏览文本文件,每次收到一个单词时,您都会检查 TreeMap 以查看您是否已经拥有该密钥,如果没有,则将其添加并创建一个以您所在的行号开头的新 TreeSet上。如果您已经拥有它,那么您只需将行号添加到集合中。所以你看我需要做的是访问集合的 .add() 函数

类似

map.get(identifier).add(lineNumber);

我知道这不起作用,但我该怎么做? 我的意思是,如果有一种更简单的方法来做我想做的事情,我会很乐意这样做,但我仍然想知道如何以这种方式去做,只是因为你知道学习和经验等等.

【问题讨论】:

    标签: java treemap treeset


    【解决方案1】:

    考虑以下逻辑(我假设输入单词在一个数组中):

    TreeMap<String, TreeSet<Integer>> index = new TreeMap<String, TreeSet<Integer>>();
    for (int pos = 0; pos < input.length; pos++) {
        String word = input[pos];
        TreeSet<Integer> wordPositions = index.get(word);
        if (wordPositions == null) {
            wordPositions = new TreeSet<Integer>();
            index.put(word, wordPositions);
        }
        wordPositions.add(pos);
    } 
    

    这会产生您需要的索引,该索引从字符串映射到字符串出现的位置集。根据您的具体需求,可以将外部/内部数据结构分别更改为HashMap/HashSet。

    【讨论】:

      【解决方案2】:

      为什么不使用StringArrayList&lt;int&gt; 中的Map,例如:

      Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
      

      然后总是当你得到一个词时,你检查它是否已经存在于Map,如果它确实存在,你将行号添加到List,如果没有,你在Map中创建一个新条目对于给定的单词和给定的行号。

      if (map.get(word ) != null) {
          map.get(word).add(line);
      }
      else{
          final List<Integer> list = new ArrayList<Integer>();
          list.add(line);
          map.put(word, list);
      }
      

      【讨论】:

        【解决方案3】:

        如果我理解正确,您希望有一个树图,其中每个键都引用一个树集,用于存储该键出现的行号。这绝对是可行的,而且实现起来非常简单。我不确定为什么您的 map.get(identifier).add(lineNumber); 不起作用。我会这样做:

        TreeMap<String, TreeSet<Integer>>  map = new TreeMap<String, TreeSet<Integer>>();
                TreeSet<Integer> set = new TreeSet<Integer>();
                set.add(1234);
                map.put("hello", set);
                map.get("hello").add(123);
        

        一切正常。

        【讨论】:

          【解决方案4】:

          您的构造不起作用的唯一原因是map.get(identifier) 的结果可能为空。就个人而言,我喜欢@EyalSchneider 回答的惰性初始化解决方案。但是,如果您提前知道所有标识符,还有另一种选择:例如,如果您使用所有已知的英语单词预加载 Map。然后您可以执行以下操作:

          for (String word : allEnglishWords) {
              map.put(word, new LinkedList<Integer>);
          }
          
          for (int pos = 0; pos < input.length; pos++) {
              String word = input[pos];
              map.get(word).add(pos);
          }
          

          【讨论】:

            猜你喜欢
            • 2012-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-12
            • 1970-01-01
            • 2022-11-02
            • 2014-05-03
            • 2016-10-08
            相关资源
            最近更新 更多