当字符串中有逗号时,找不到两个字符串数组的正确交集

Posted

技术标签:

【中文标题】当字符串中有逗号时,找不到两个字符串数组的正确交集【英文标题】:cannot find correct intersection of two string arrays when there is comma in strings 【发布时间】:2015-12-08 14:53:02 【问题描述】:

我有两个 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] 作为"Comedy,Action""Action" 的交集。 如果有人知道如何解决此问题,我将不胜感激。 非常感谢,

【问题讨论】:

因为当您使用, 拆分时,您会得到"Action"Action" 【参考方案1】:

尝试删除两个字符串中的双引号。

因为当你分裂时

"tt0306047","喜剧,动作","nm0267506,nm0000221,nm0356021","dir_ nm0001878","美国"

你会得到一个

动作”

token ,它永远不会匹配

“行动”

令牌。

【讨论】:

感谢您的回答。抱歉,我对 Java 很陌生。我应该使用line = line.replace("\"", ""); 吗?【参考方案2】:

如果您打印您的线路,它会是什么样子?我认为您的问题在于读取文件,例如:

"005c2e08","Action","nm0000148","dir_ nm0764316","USA"

用','分割会产生:

"005c2e08" “行动”

等等。而对于您的第二行,它将是:

“tt0306047” “喜剧 行动”

这就是为什么美国在拦截,但行动不是。

使用 csv reader 读取 csv 文件,然后用逗号分割 CSV 行的属性。这样你就可以摆脱引号,你的代码就可以工作了

例如,这个库对于读取 CSV 文件非常方便:

http://opencsv.sourceforge.net/

【讨论】:

不用担心。对于您的示例,它应该真正开箱即用。否则,您可以告诉 opencsv 您的分隔符和报价是什么。这样,它会将引号内的逗号视为 CSV,并将引号外的逗号视为 CSV 的分隔符。他们的网站上有一个很好的例子。 非常感谢您的帮助。我只需从两个字符串中删除“”即可得到答案:)

以上是关于当字符串中有逗号时,找不到两个字符串数组的正确交集的主要内容,如果未能解决你的问题,请参考以下文章

用逗号分隔数组,但是当涉及到最后一个字符串时,删除逗号[重复]

当 csv 文件在字符串中有逗号时,Snowflake 数据库中的复制命令失败

H2:当名称中有数字时找不到列

[HAOI2016]找相同字符(后缀数组+单调栈)

字符串(后缀数组):HAOI2016 找相同子串

两个字符串数组的快速 count() 交集