我目前正在开发一个项目,需要使用下面列出的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
请有人可以帮助解决这个问题,或者对最佳方法有什么想法吗?
答案 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>();