我的问题是,我从 csv 文件创建了一个数组,现在必须输出任何具有重复项的值。 该文件的布局为 5x9952。它由以下数据组成:
id,birthday,name,sex, first name
我现在希望程序在每一列(例如名称)中向我显示有哪些重复项。就像有两个同名的人一样。但无论我在互联网上找到什么,我都会尝试只显示行的重复项(例如姓名和名字是否相同)。 这是我到目前为止所得到的:
package javacvs;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
*
* @author Tobias
*/
public class main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String csvFile = "/Users/Tobias/Desktop/PatDaten/123.csv";
String line = "";
String cvsSplitBy = ",";
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
while ((line = br.readLine()) != null) {
// use comma as separator
String[] patDaten = line.split(cvsSplitBy);
for (int i = 0; i < patDaten.length-1; i++)
{
for (int j = i+1; j < patDaten.length; j++)
{
if( (patDaten[i].equals(patDaten[j])) && (i != j) )
{
System.out.println("Duplicate Element is : "+patDaten[j]);
}
}
}
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
(我更改了 csv 的名称,因为它包含 secret 数据)
最佳答案
真正的事情是:停止思考“低水平”。好的 OOP 就是创建有用的抽象。
换句话说:您的第一站应该是创建一个有意义的类定义来表示一行的内容,我们将其称为 Person
现在上课。然后你将进一步关注的问题分开:
- 您创建一个类/方法,除了读取该 CSV 文件之外什么也不做 - 并为每行创建一个 Person 对象
- 您创建了一个有意义的数据结构,可以告诉您有关重复项的信息
后者可以(例如)某种反向索引。意思是:你有一个Map<String, List<Person>>
。阅读完所有 Person 对象(可能在一个简单的列表中)后,您可以执行以下操作:
Map<String, List<Person>> personsByName = new HashMap<>();
for (Person p : persons) {
List<Person> personsForName = personsByName.get(p.getName());
if (personsByName == null) {
personsForName = new ArrayList<>();
personsByName.put(p.getName(), personsForName);
}
personsForName.add(p);
}
在该循环之后,该 map 包含表中使用的所有名称 - 对于每个名称,您都有相应人员的列表。
关于java - 显示 csv 文件中字符串数组中的重复项 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45995356/