如何从JAVA中的CSV文件中删除重复集

时间:2017-09-27 08:47:10

标签: java csv

我目前正在开发一个项目,需要使用下面列出的Java方法从CSV文件中删除重复的值集:

CSVUtilsExample.java

package lacsp.portal.backing.oracle.webcenter.portalapp.pages;

import java.io.FileWriter;

import java.text.DecimalFormat;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class CSVUtilsExample {

public static void main(String[] args) throws Exception {

    Random rand = new Random();
    int randomSets = rand.nextInt(100000) + 1;
    int val = 1;
    final DecimalFormat decimalFormat = new DecimalFormat("0000");
    String csvFile = "C:/work/tableOutput.csv";
    FileWriter writer = new FileWriter(csvFile);
    CSVUtils.writeLine(writer, Arrays.asList("SET_ID", "INT_VALUE"));
    // Will loop whilst val is less than the random sets generated
    while (val <= randomSets) {
        // Create an empty list
        List<Order> orders = new ArrayList<Order>();
        // Single set id for all items
        String setId = "S" + decimalFormat.format(val);
        // Create a bunch of orders between 10 and 500
        int numOrders = rand.nextInt(490)+10;
        for (int i = 0; i < numOrders; i++) {
            // Create a new Order and add it to the list
            orders.add(new Order(setId, rand.nextInt(1000) + 1));
        }
        for (Order o : orders) {
            List<String> list = new ArrayList<String>();
            list.add(o.getSET_ID());
            list.add(o.getINT_VALUE().toString());
            CSVUtils.writeLine(writer, list);
        }
        val++;
    }

    writer.flush();
    writer.close();

}


}

Order.Java

package lacsp.portal.backing.oracle.webcenter.portalapp.pages;

public class Order {

private String SET_ID;
private Integer INT_VALUE;

public Order(String SET_ID, Integer INT_VALUE) {
    this.SET_ID = SET_ID;
    this.INT_VALUE = INT_VALUE;

}

public void setSET_ID(String SET_ID) {
    this.SET_ID = SET_ID;
}

public String getSET_ID() {
    return SET_ID;
}

public void setINT_VALUE(Integer INT_VALUE) {
    this.INT_VALUE = INT_VALUE;
}

public Integer getINT_VALUE() {
    return INT_VALUE;
}
}

当我运行上面的内容时,它会创建一个包含100000个SET_ID记录和随机数量的INT_VALUE记录的.csv文件,一旦创建了这个记录,我就会想要创建一个方法,删除或删除任何已创建的重复项到一个单独的文件,例如:

SET_ID, INT_VALUE
'S0001', 1
'S0001', 3
'S0001', 12
'S0001', 7
'S0001', 9

'S0002', 3
'S0002', 12
'S0002', 7

'S0003', 5
'S0003', 6
'S0003', 7
'S0003', 12
'S0003', 13

'S0004', 5
'S0004', 6
'S0004', 7
'S0004', 12
'S0004', 13

应该减少到

SET_ID, INT_VALUE
'S0001', 1
'S0001', 3
'S0001', 12
'S0001', 7
'S0001', 9

'S0003', 5
'S0003', 6
'S0003', 7
'S0003', 12
'S0003', 13

请有人可以帮助解决这个问题,或者对最佳方法有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是拥有唯一的SET_ID:

1-将它们存储在Set(Java SE API of Set "add" method)中,并且也是

2-重写继承自java.lang.Object see how here的类Order中的equals()和hashCode()方法。

在Set中存储Order实例可以保证不会重复,并且重写equals()AND hashCode()定义如何比较两个Order实例以评估它们是否相等。

必须重写equals()方法,否则,在从java.lang.Object继承的默认equals()方法中,只有当两个实例位于同一内存中时,才认为它们是相等的。

我会添加 Order.java

@Override
public int hashCode() {
    int hash = 7;
    hash = 17 * hash + Objects.hashCode(this.SET_ID);
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final NewClass other = (NewClass) obj;
    if (!Objects.equals(this.SET_ID, other.SET_ID)) {
        return false;
    }
    return true;
}

并会更改 CSVUtilsExample.java ,而不是:

List<Order> orders = new ArrayList<Order>();

的用途:

Set<Order> orders = new HashSet<Order>();