如何在Java中迭代两次Map值

时间:2017-12-07 16:46:32

标签: java loops hashmap mapping naivebayes

我知道还有其他解决方案,但没有什么对我有用。

问题:在我的主要方法中,我通过评级将ID组合在一起,并将评级作为密钥,将信息的其余部分作为列表。当我创建hashmap并放入列表时,我可以准确地打印hashmap的内容。但是,一旦我将map方法传递给map,就会丢失值,并且我无法以与main方法相同的方式进行迭代,即使逻辑相同。我对java中的Map类没有经验。有人可以帮我弄清楚为什么当我将Map传递给我的evaluate方法时,我不能再迭代Map了?

import java.io.*;
import java.util.*;


public class Evaluate {

public static double grandTotal;

public static void main(String[] args) throws Exception {

    FileInputStream fs = new FileInputStream("testInput.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(fs));
    FileInputStream fs2 = new FileInputStream("testTest.txt");
    BufferedReader br2 = new BufferedReader(new InputStreamReader(fs2));
    String line;
    String line2;
    String[] bloop;
    String bleep;
    String flooper; 
    String splitter;
    String[] splitInput;
    List<String> oneStarList= new ArrayList<String>();
    List<String> twoStarList= new ArrayList<String>();
    List<String> threeStarList= new ArrayList<String>();
    List<String> fourStarList= new ArrayList<String>();
    List<String> fiveStarList= new ArrayList<String>();
    List<String> values2 = new ArrayList<String>();

    try {

        while ((line=br.readLine()) != null) {
            bloop = new String[10];
            bloop = line.split("\\s+");
            bleep = bloop[1].toString();
            flooper = (bloop[0]+" "+bloop[2]+" "+bloop[3]+" "+bloop[4]);
            if (bleep.equals("1")){
                oneStarList.add(flooper);
            }
            else if (bleep.equals("2")){
                twoStarList.add(flooper);
            }
            else if (bleep.equals("3")){
                threeStarList.add(flooper);
            }
            else if (bleep.equals("4")){
                fourStarList.add(flooper);
            }
            else if (bleep.equals("5")){
                fiveStarList.add(flooper);
            }
            grandTotal+=(Double.parseDouble(bloop[2]));
        }
    }
    catch (Exception e){
    }

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

    hmap.put("1",oneStarList);
    hmap.put("2", twoStarList);
    hmap.put("3", threeStarList);
    hmap.put("4", fourStarList);
    hmap.put("5", fiveStarList);


    while ((line2=br2.readLine()) != null) {
        splitInput = new String[5];
        splitInput = line2.split("\\s+");
        evaluate(splitInput[0],splitInput[1],hmap);
    }
    br.close();
    br2.close();
}

public static void evaluate(String movID, String usrID, Map<String,List<String>> hash) throws Exception{

    FileWriter fw = new FileWriter("outputTest.txt");
    BufferedWriter bwr = new BufferedWriter(fw);
    List<String> values = new ArrayList<String>();
    List<String> outputList = new ArrayList<String>();
    String[] floop;
    String fleep;
    int movIDtotal=0;
    int usrIDtotal=0;
    int totalValues=0;
    double pmovIDStar=0;
    double pusrIDStar=0;
    double pmovID=0;
    double pusrID=0;
    double numID=0;
    double keyTotalProb=0;
    String keyOutputStr;
    String keyHold;

    final Set<Map.Entry<String,List<String>>> entries = hash.entrySet();

    for (String key : hash.keySet()){
        values = hash.get(key);
        System.out.println(key + ":");
        for (int i=0;i<values.size();i++){
            System.out.println(values.get(i));
            floop = new String[5];
            fleep = values.get(i);
            floop = fleep.split("\\s+");
            if (movID.equals(floop[0])){
                movIDtotal++;
                totalValues++;
            }
            if (usrID.equals(floop[0])){
                usrIDtotal++;
                totalValues++;
            }
        }
        values.clear();
    }

    for (Map.Entry<String, List<String>> entry: entries){
        values= entry.getValue();
        keyHold = entry.getKey();
        for (int j=0;j<values.size();j++){

            floop = new String[5];
            fleep = values.get(j);
            floop = fleep.split("\\s+");
            if (movID.equals(floop[0])){
                pmovIDStar = Double.parseDouble(floop[3]);
                numID = Double.parseDouble(floop[1]);
                pmovID = (numID/movIDtotal);
            }
            if (usrID.equals(floop[0])){
                pusrIDStar = Double.parseDouble(floop[3]);
                numID = Double.parseDouble(floop[1]);
                pusrID = (numID/usrIDtotal);
            }
        }
        keyTotalProb = ((totalValues/grandTotal)*(pmovIDStar)*(pusrIDStar))/(pusrID*pmovID);
        keyOutputStr = Double.toString(keyTotalProb);
        outputList.add(keyHold);
        outputList.add(keyOutputStr);
        values.clear();
    }

    double max = Double.MIN_VALUE;
    for (int m=0;m<outputList.size();m+=2){
        double coolguy = Double.parseDouble(outputList.get(m+1));
        int index = 0;
        if(coolguy>max){
            max = coolguy;
            index = m;
        }

        try {
            bwr.write(String.format("%-1s %-1s %-1s%n", movID,usrID,outputList.get(index)));
            bwr.close();
            fw.close();
        }
        catch(Exception e) {

        }
    }
}

}

备份信息:我正在尝试构建一个java程序,该程序基本上执行朴素贝叶斯算法的最后阶段,以预测电影的用户评级(1-5)。我已经使用MapReduce训练数据,现在我有一个输入文件,其中每行包含一个字符串,其中包含此顺序中没有逗号的信息(电影或用户ID,评级,评级和ID的总次数,总次数,次数) ID总共发生,ID和评级在ID的所有评级中一起出现的概率。基本上这是分类阶段。

1 个答案:

答案 0 :(得分:0)

  1. 永远不要压抑异常。特别是当你进行编码/调试时。

    catch (Exception e){ }是非常糟糕的做法

  2. 当你这样做时:

    final Set<Map.Entry<String,List<String>>> entries = hash.entrySet();

  3. 它不会将hash.entrySet复制到entries。它创建了另一个参考。  同样适用于values= entry.getValue();

    1. 然后你的第一次循环(以及其他循环)后你会有什么期望? 当你这样做时:

      values.clear();

      您的值已从hash中的列表中删除,因为entries只是hash.entrySet()您对已完成内容的引用 - 空列表。