【发布时间】:2015-06-06 20:12:39
【问题描述】:
这是我在这里的第一个问题,请多多包涵。我有一个看起来像这样的文本文件;
用户 ID、项目 ID、评级
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
我想要完成的是每行读取文件行并分隔每个值。完成后,将所有唯一的用户 ID 放在此地图的关键部分; Map<Integer, Map<Integer, Double>>。并将带有评分的 itemIds 放置在与第一个 map 的 key 对应的第二个 map 中。还能跟着我吗??这是我到目前为止生成的代码,但不是我想要的结果。
这是我的用户类:
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
我的代码只添加了前两个 userId 及其对应的 itemId 和评级。有人可以向我解释我做错了什么吗?也许展示我如何改进这段代码以使其正常工作??
提前致谢。
【问题讨论】:
-
您是否尝试过自己调试应用程序?你在用日食吗? vogella.com/tutorials/EclipseDebugging/article.html
-
是的,我已经尝试调试代码。我正在使用 intellij idea 来编写我的代码。
标签: java object arraylist hashmap