字符串中有逗号时无法找到两个字符串数组的正确交集
cannot find correct intersection of two string arrays when there is comma in strings
我有两个 CSV 文件:"userfeatures" 和 "itemfeatures"。
userfeature 中的每一行都与特定用户相关。例如,userfeature 文件中的第一行是:
005c2e08","Action","nm0000148","dir_ nm0764316","USA"
我需要找到该行与第二个文件的每一行的交集"itemfeatures"。 (实际上,我需要为所有用户重复此过程,即 "userfeatures" 的所有行)。
因此,第一个比较将与 "itemfeatures" 的第一行进行比较,即:
"tt0306047","Comedy,Action","nm0267506,nm0000221,nm0356021","dir_ nm0001878","USA"
交集的结果应该是 ["Action", "USA]"
但不幸的是,我的代码只找到 ["USA"] 作为匹配项。到目前为止,这是我尝试过的:
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader userfeatures = new BufferedReader(new FileReader("userFeatureVectorsTest.csv"));
BufferedReader itemfeatures = new BufferedReader(new FileReader("ItemFeatureVectorsTest.csv"));
ArrayList<String> userlines = new ArrayList<>();
ArrayList<String> itemlines = new ArrayList<>();
String Uline = null;
while ((Uline = userfeatures.readLine()) != null) {
for (String Iline = itemfeatures.readLine(); Iline != null; Iline = itemfeatures.readLine()) {
System.out.println(Uline);
System.out.println(Iline);
System.out.println(intersect(Uline, Iline));
System.out.println(union(Uline, Iline));
}
}
userfeatures.close();
itemfeatures.close();
}
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;
}
static Set<String> union(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.addAll(IlineSet);
return result;
}
}
我认为问题与 Uline.split(",")
和 Iline.split(",")
有关,因为他们将 "Comedy,Action"
视为 1 个单词,因此找不到 [Action]
作为 [=16 的交集=] 和 "Action"
。
如果有人知道如何解决此问题,我将不胜感激。
非常感谢,
尝试删除两个字符串中的双引号。
因为当你分裂的时候
"tt0306047","Comedy,Action","nm0267506,nm0000221,nm0356021","dir_
nm0001878","USA"
您将获得
Action"
token ,永远不会匹配
"Action"
令牌。
如果你打印你的线条,它看起来像什么?我认为您的问题在于读取文件,例如:
"005c2e08","Action","nm0000148","dir_ nm0764316","USA"
用“,”拆分将导致:
"005c2e08"
"Action"
等等。而对于您的第二行,它将是:
"tt0306047"
“喜剧
行动
这就是为什么美国在拦截,但没有采取行动。
使用A csv reader读入csv文件,然后用逗号分割CSV行的属性。这样你就可以去掉引号,你的代码就可以工作
例如,这个库对于读取 CSV 文件非常方便:
我有两个 CSV 文件:"userfeatures" 和 "itemfeatures"。 userfeature 中的每一行都与特定用户相关。例如,userfeature 文件中的第一行是:
005c2e08","Action","nm0000148","dir_ nm0764316","USA"
我需要找到该行与第二个文件的每一行的交集"itemfeatures"。 (实际上,我需要为所有用户重复此过程,即 "userfeatures" 的所有行)。
因此,第一个比较将与 "itemfeatures" 的第一行进行比较,即:
"tt0306047","Comedy,Action","nm0267506,nm0000221,nm0356021","dir_ nm0001878","USA"
交集的结果应该是 ["Action", "USA]"
但不幸的是,我的代码只找到 ["USA"] 作为匹配项。到目前为止,这是我尝试过的:
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader userfeatures = new BufferedReader(new FileReader("userFeatureVectorsTest.csv"));
BufferedReader itemfeatures = new BufferedReader(new FileReader("ItemFeatureVectorsTest.csv"));
ArrayList<String> userlines = new ArrayList<>();
ArrayList<String> itemlines = new ArrayList<>();
String Uline = null;
while ((Uline = userfeatures.readLine()) != null) {
for (String Iline = itemfeatures.readLine(); Iline != null; Iline = itemfeatures.readLine()) {
System.out.println(Uline);
System.out.println(Iline);
System.out.println(intersect(Uline, Iline));
System.out.println(union(Uline, Iline));
}
}
userfeatures.close();
itemfeatures.close();
}
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;
}
static Set<String> union(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.addAll(IlineSet);
return result;
}
}
我认为问题与 Uline.split(",")
和 Iline.split(",")
有关,因为他们将 "Comedy,Action"
视为 1 个单词,因此找不到 [Action]
作为 [=16 的交集=] 和 "Action"
。
如果有人知道如何解决此问题,我将不胜感激。
非常感谢,
尝试删除两个字符串中的双引号。
因为当你分裂的时候
"tt0306047","Comedy,Action","nm0267506,nm0000221,nm0356021","dir_ nm0001878","USA"
您将获得
Action"
token ,永远不会匹配
"Action"
令牌。
如果你打印你的线条,它看起来像什么?我认为您的问题在于读取文件,例如:
"005c2e08","Action","nm0000148","dir_ nm0764316","USA"
用“,”拆分将导致:
"005c2e08" "Action"
等等。而对于您的第二行,它将是:
"tt0306047" “喜剧 行动
这就是为什么美国在拦截,但没有采取行动。
使用A csv reader读入csv文件,然后用逗号分割CSV行的属性。这样你就可以去掉引号,你的代码就可以工作
例如,这个库对于读取 CSV 文件非常方便: