我有两个CSV文件:" userfeatures"和" itemfeatures"。
我应该将每行用户特征与每行项目特征进行比较,以找到每行的匹配(交叉点)。 例如,userfeature文件中的第一行是:
005c2e08","Action","nm0000148","dir_ nm0764316","India"
现在,我需要找到这一行(与用户1相关)与第二个文件" itemfeatures"的每一行的交集。第二个文件具有相同的结构,因此,例如,第一个比较将是" itemfeatures"那就是:
"tt0306047","Comedy","nm0267506,nm0000221,nm0356021","dir_ nm0001878","USA,Canada"
以下是我迄今为止所做的尝试:
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader userfeatures = new BufferedReader(new FileReader("userfeatures.csv"));
BufferedReader itemfeatures = new BufferedReader(new FileReader("itemfeatures.csv"));
ArrayList<String> userlines = new ArrayList<>();
ArrayList<String> itemlines = new ArrayList<>();
String Uline = null;
String Iline = null;
while ((Uline = userfeatures.readLine()) != null) {
for (int i=1; i< userlines.size(); i++){
userlines.add(Uline);
intersect(Uline, Iline).size();
}
}
// System.out.println(Uline);
userfeatures.close();
itemfeatures.close();
}
static ArrayList<String> intersect(String Uline, String Iline) {
ArrayList<String> result = new ArrayList<String>();
result.retainAll(Iline);
return result;
}
}
似乎我不能将retainAll用于类型&#34; String&#34;,所以我想知道如何解决这个问题?我在这里搜索了很多,但我发现的只是找到除this one之外的数组的交集。 (但是这篇文章与我的案例不同,因为它比较了字符串中的每个字符,而我需要逐字逐句比较)。
答案 0 :(得分:2)
尝试将Uline
和Iline
转换为字词,然后更改为使用Set<String>
代替Array<String>
:
static Set<String> intersect(String Uline, String Iline) {
Set<String> result = new HashSet<String>(Arrays.asList(Uline.split(",")));
Set<String> IlineSet = new HashSet<String>(Arrays.asList(Iline.split(",")));
result.retainAll(IlineSet);
return result;
}
答案 1 :(得分:1)
首先,将行拆分为数组。然后,在非空数组上调用retainAll
。