2016-01-25 38 views
0

我有一个代码将输出来自List和Map的数据。我如何将相应的数字相乘?来自List和Map的Java乘法值

从列表

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

输出的输出从地图

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

} 

欣赏任何帮助。谢谢!

+0

这还不清楚。你能解释一下当前代码在做什么,它应该做什么以及它做错了什么? – Tunaki

+0

当前代码没有问题。我只是不确定如何将List和Map之间的值相乘。列表和地图的当前输出如前所述,并且我需要将它们相互乘以对应于它们的位置。 – Cael

+1

注意:一个HashMap没有固有的顺序,你也不应该期望一个。 –

回答

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

有一点需要注意。始终围绕代码块使用大括号是一种很好的做法。包括单行“if”表述或“for”循环。 – NotACleverMan