【问题标题】:Java: Populate ArrayList from CSV file and remove duplicates-- common methods not workingJava:从 CSV 文件填充 ArrayList 并删除重复项——常用方法不起作用
【发布时间】:2016-05-01 17:08:52
【问题描述】:

我想获取 CSV 文件的内容并删除其中的重复项。这是一个在这里和其他地方得到了很多报道的话题,但没有一个建议的方法对我有用:最终结果仍然包含重复的值。

这些是我从 CSV 文件中获取文本的步骤:

String holder = "";

    Scanner input = new Scanner(new File("C:"+File.separator+"followers.csv")).useDelimiter(",");


List<String> temp = new ArrayList<String>();

while (input.hasNext())
{

    holder = input.next();
    temp.add(holder);

}

input.close();

到目前为止,一切都很好。

在尝试将 ArrayList 转换为 LinkedHashSet 和其他很多东西后,都无济于事,这就是我目前正在做的事情:

List<String> finalList = new ArrayList<String>();

for (String s : temp) 
        {
            if (!finalList.contains(s))
            {
                finalList.add(s);
            }
        }

        finalList.forEach(System.out::println);

但 finalList 仍然包含重复值。

我假设问题在于我如何首先将 CSV 值放入 ArrayList,但我不知道我哪里出错了。

【问题讨论】:

  • 你确定有重复吗?集合不会存储重复项,上述循环也不会添加重复项。要么您发布的代码中没有发生某些事情,要么可能存在编码问题,其中字符看起来相同但实际上不同。
  • 我很确定。我正在使用一个只有“一”、“二”、“二”和“三”字样的测试 CSV 文件。显然,我希望省略多余的“二”。
  • 缺少一些关键信息。确保包含所有代码,包括 CSV 文件。此外,包括在您的forEach 中登录的内容。如果您将值记录在 temp 中,是否符合您的预期。

标签: java csv arraylist file-io


【解决方案1】:

删除重复项(不保持顺序)的优雅解决方案是

    Set<String> hs = new HashSet<>();

    //assume the ArrayList temp contains your data with duplicates
    hs.addAll(temp);
    temp.clear();
    temp.addAll(hs);

temp 然后包含没有重复的数据。

【讨论】:

  • A HashSet 不会保留数据的顺序,这可能是 OP 尝试使用 LinkedHashSet 的原因。这只是解决同一问题的另一种方法,并没有解释为什么他们的解决方案不起作用。
  • 试过了,还是不行。
【解决方案2】:

您可能会将空格和新行与您的值混合在一起,因此会出现重复项。尝试使用 uniVocity-parsers CsvParser 进行解析,因为它会为您消除这些问题,运行速度更快,并且为您提供更好的一般处理 CSV 格式的支持。

试试这个来消除你的欺骗:

CsvParserSettings settings = new CsvParserSettings();
settings.getFormat().setLineSeparator("\n");

// creates a CSV parser
CsvParser parser = new CsvParser(settings);

// parses all rows in one go.
List<String[]> allRows = parser.parseAll(new File("C:"+File.separator+"followers.csv")));

Set<String> result = new LinkedHashSet<>();
for(String[] row : allRows){
    for(String element : row){
        if(element != null){
            //assuming the case of these these elements don't matter
            //remove the ".toLowerCase()" part if it does.
            result.add(element.toLowerCase());
        }
    }
}

System.out.println(result); //here's your deduplicated data.

希望对你有帮助。

披露:我是这个库的作者,它是开源免费的(Apache 2.0 许可)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2021-12-23
    • 2016-03-29
    • 2023-03-27
    • 1970-01-01
    • 2021-12-24
    • 2018-05-29
    相关资源
    最近更新 更多