【问题标题】:How to Iterate Twice over Map values in Java如何在 Java 中对 Map 值进行两次迭代
【发布时间】:2018-05-21 20:13:42
【问题描述】:

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

问题:在我的主要方法中,我按评级将 ID 组合在一起,并将评级作为键,将其余信息作为列表的值。当我创建哈希图并放入列表时,我可以准确地打印哈希图的内容。但是,一旦我将 map 传递给评估方法,值就会丢失,并且我无法像在 main 方法中那样进行迭代,即使逻辑是相同的。我对 java 中的 Map 类没有经验。有人可以帮我弄清楚为什么当我将 Map 传递给我的评估方法时我不能再迭代 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 的所有评级中)。本质上这是分类阶段。

【问题讨论】:

    标签: java loops hashmap mapping naivebayes


    【解决方案1】:
    1. 永远不要抑制异常。尤其是在您进行编码/调试时。

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

    2. 当你这样做时:

      final Set&lt;Map.Entry&lt;String,List&lt;String&gt;&gt;&gt; entries = hash.entrySet();

    它不会将hash.entrySet 复制到entries。它创建了另一个对它的引用。 values= entry.getValue();也是如此

    1. 那么在您的第一个循环(以及其他循环)之后您期望什么? 当你这样做时:

      values.clear();

      您的值从 hash 中的列表中消失了,因为 entries 只是对 hash.entrySet() 的引用,您已经完成了您所做的 - 空列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-03
      • 2011-08-31
      • 1970-01-01
      • 2023-04-04
      • 2021-06-23
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      相关资源
      最近更新 更多