【问题标题】:Java multiply value from a List and MapJava 将 List 和 Map 中的值相乘
【发布时间】:2016-01-25 13:20:05
【问题描述】:

我有一个代码可以从 List 和 Map 中输出数据。如何将对应的数字相乘?

List 的输出

{prepare=0.25, saturday=0.5, republic=0.25, approach=0.25, ...}

地图的输出

[0, 1, 0, 0,...]

我需要让它们乘以相应的数字并求和。 total 将是我想要的输出,如下所示:

(0.25*0)+(0.5*1)+(0.25*0)+(0.25*0).... = total 

这是我的示例代码:

import java.util.*;
import java.util.stream.Collectors;

class WordOcc {
  public static void main(String[] args) {
    String someText = "hurricane gilbert head dominican coast saturday. hurricane gilbert sweep dominican republic sunday civil  prepare high wind heavy rain high sea. storm approach southeast sustain wind  mph   mph. there alarm civil defense director   a television alert shortly midnight saturday.";

    List<List<String>> sort = new ArrayList<>();
    Map<String, ArrayList<Integer>> res = new HashMap<>();

    for (String sentence : someText.split("[.?!]\\s*"))
    {
        sort.add(Arrays.asList(sentence.split("[ ,;:]+"))); //put each sentences in list
    }

    // put all word in a hashmap with 0 count initialized
    int sentenceCount = sort.size();

    for (List<String> sentence: sort) {
        sentence.stream().forEach(x -> res.put(x, new ArrayList<Integer>(Collections.nCopies(sentenceCount, 0))));
    }

    int index = 0;
    // count the occurrences of each word for each sentence.
    for (List<String> sentence: sort) {
        for (String q : sentence) {
            res.get(q).set(index, res.get(q).get(index) + 1); 
        }
        index++;
    }


    Map<String,Float>word0List = getFrequency(res);

    System.out.println(word0List + "\n"); //print the list value      

    //get first sentence count value from each word
    List<Integer> sentence0List = getSentence(0, res);

    System.out.println(sentence0List + "\n"); //print the map value
  }

  static List<Integer> getSentence(int sentence, Map<String, ArrayList<Integer>> map) {
      return map.entrySet().stream().map(e -> e.getValue().get(sentence)).collect(Collectors.toList());
   }

 static Map<String, Float> getFrequency(Map<String, ArrayList<Integer>> stringMap) {
  Map<String, Float> res = new HashMap<>();
 stringMap.entrySet().stream().forEach(e -> res.put(e.getKey(), e.getValue().stream().mapToInt(Integer::intValue).sum() / (float)e.getValue().size()));
        return res;
      }

}

感谢您对此的任何帮助。谢谢!

【问题讨论】:

  • 这还不清楚。你能解释一下当前代码在做什么,它应该做什么以及它做错了什么吗?
  • 当前代码没有问题。我只是不确定如何将 List 和 Map 之间的值相乘。 list 和 map 的当前输出如前所述,我需要根据它们的位置将它们相乘。
  • 注意:HashMap 没有内在的顺序,你也不应该期望它。
  • 同一个词在一个句子中出现多次怎么办?
  • List 只会存储一个单词的实例。你可以在这里试试:repl.it/Bg6D/2

标签: java list dictionary


【解决方案1】:

我不确定这是否是您要查找的内容,因为 cmets 中提到的哈希映射没有任何顺序。但正如你所描述的,你想做这样的事情:

float result = 0;
Float[] hmValues = word0List.values().toArray(new Float[0]);
for(int i = 0; i < word0List.size(); i++)
    result += hmValues[i] * sentence0List.get(i);

【讨论】:

  • 有一点需要注意。始终在代码块周围使用大括号是一种很好的做法。包括单行“if”语句或“for”循环。
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 2021-02-23
  • 1970-01-01
  • 2020-01-26
  • 2021-10-26
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多