Java从List和Map中乘以值

时间:2016-01-25 13:20:05

标签: java list dictionary

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

List

的输出
{prepare=0.25, saturday=0.5, republic=0.25, approach=0.25, ...}

Map的输出

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

我需要将它们与相应的数字相乘并总结它们。 总计将是我想要的输出,如下所示:

(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;
      }

}

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

1 个答案:

答案 0 :(得分:1)

我不确定这是否是您正在寻找的东西,因为评论中提到的散列图没有任何顺序。但正如你所描述的,你想做这样的事情:

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);