2015-04-02 49 views
1

这是我的第一个问题,所以请耐心等待。我有一个文本文件,看起来像这样;将一个文本文件插入一个Map <Integer,Map <Integer,Double >>

用户id,的itemId,评级
1,101,2.5
4,103,3.0
1,103,3.0
6,104,3.5
2,101,3.0
4,106,4.5
2,103,1.5
5,102,4.0
2,105,3.5
7,106,3.0
3,101,2.5
3,102,3.0

我试图完成的是读取每行的文件行并分离每个值。在完成之后,将所有唯一的userIds放置在该地图的关键部分; Map<Integer, Map<Integer, Double>>。并将itemIds与第一张地图的关键字对应的第二张地图中的评分放在一起。你还能跟着我吗?这是我迄今制作的代码,而不是我想要的结果。

这是我的用户等级:

package com.example; 

import java.util.HashMap; 
import java.util.Map; 

public class User { 
    private int mUserId; 
    private Map<Integer, Double> mRatedItems; 

    public User(int userId) { 
     mUserId = userId; 
     mRatedItems = new HashMap<>(); 
    } 

    public int getUserId() { 
     return mUserId; 
    } 

    public void setUserId(int userId) { 
     mUserId = userId; 
    } 

    public Map<Integer, Double> getRatedItems() { 
     return mRatedItems; 
    } 

    public void addRatedItems(int itemId, double rating) { 
     mRatedItems.put(itemId, rating); 
    } 
} 

这是我需要修改文件:

package com.example; 

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.*; 

public class TextFile { 
    List<User> mUserIdList; 
    private User mUser; 

    public Map<Integer, Map<Integer, Double>> readFile(String fileName) { 
     mUserIdList = new ArrayList<>(); 
     Map<Integer, Map<Integer, Double>> userItemData = new HashMap<>(); 

     try (
      FileInputStream fis = new FileInputStream(fileName); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(fis)) 
     ) { 
      String line; 
      while ((line = reader.readLine()) != null) { 
       String[] args = line.split(","); 

       int userId = Integer.parseInt(args[0]); 
       int itemId = Integer.parseInt(args[1]); 
       double rating = Double.parseDouble(args[2]); 

       if (!mUserIdList.contains(userId)) { 
        mUser = new User(userId); 
        mUserIdList.add(mUser); 
       } 

       if (!mUserIdList.isEmpty()) { 
        addItemRatings(userId, itemId, rating); 
       } 

       if (!checkDuplicates()) { 
        userItemData.put(mUser.getUserId(), mUser.getRatedItems()); 
       } 
      } 
     } catch (IOException e) { 
      System.out.printf("Problem loading: %s %n", fileName); 
      e.printStackTrace(); 
     } 

     return userItemData; 
    } 

    private boolean checkDuplicates() { 
     Set<Integer> set = new HashSet<>(); 
     for (User user : mUserIdList) { 
      if (!set.add(user.getUserId())) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public void addItemRatings(int userId, int itemId, double rating) { 
     for (User user : mUserIdList) { 
      if (user.getUserId() == userId) { 
       user.addRatedItems(itemId, rating); 
      } 
     } 
    } 

    public int showTextLines(String fileName) { 
     int textLines = 0; 
     try (
       FileInputStream fis = new FileInputStream(fileName); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(fis)) 
     ) { 
      while (reader.readLine() != null) { 
       textLines++; 
      } 
      reader.close(); 
     } catch (IOException e) { 
      System.out.printf("Problem showing total lines from: %s %n", fileName); 
      e.printStackTrace(); 
     } 
     return textLines; 
    } 
} 

这是我的主类:

package com.example; 

import java.util.Map; 

public class Main { 

    public static void main(String[] args) { 
     TextFile textFile = new TextFile(); 
     String location = "D:\\IdeaProjects\\KMeans\\src\\com\\quincy\\userItem1.data"; 
     Map<Integer, Map<Integer, Double>> readFile = textFile.readFile(location); 
     int textLines = textFile.showTextLines(location); 
     System.out.printf("File: %s %n", readFile); 
     System.out.printf("Number of lines in file: %s %n", textLines); 
    } 
} 

而且我的输出是:

File: {1={101=2.5, 103=3.0}, 4={103=3.0, 106=4.5}} 
Number of lines in file: 12 

我的代码只添加了前两个userIds及其相应的itemIds和rating。有人可以向我解释我做错了什么吗?也许显示我可以如何改善此代码正常工作?

在此先感谢。

+0

您是否尝试过自己调试应用程序?你在使用eclipse吗? http://www.vogella.com/tutorials/EclipseDebugging/article.html – 2015-04-02 01:06:12

+0

是的,我试过调试代码。我使用intellij的想法来写我的代码。 – 2015-04-02 11:12:09

回答

0

问题出在您的checkDuplicates()方法中。我不知道你在这个功能上想要达到什么目的,但是如果你想检查重复。那么,我建议你只用这个功能containsKey()

if (!userItemData.containsKey(mUser.getUserId())) { 
    userItemData.put(mUser.getUserId(), mUser.getRatedItems()); 
} 
+0

谢谢@kucing_terbang我正在寻找解决方案几个小时。这个解决方案适合我! – 2015-04-02 12:18:25

相关问题