gpt4 book ai didi

java - 删除文本文件中的 ArrayList 重复项 - Java

转载 作者:行者123 更新时间:2023-11-29 08:31:36 25 4
gpt4 key购买 nike

我想删除 ArrayList 中重复的用户名。我试图将 ArrayList 转换为 HashSet,但由于某种原因它不起作用。我之所以选择将 ArrayList 转换为 HashSet 是因为它不允许重复值,但是,当我在我的代码中使用它时,它只会改变列表中的顺序:

我的代码输出:

Choreography - Imran Sullivan
Goodfella - Khalil Person
DarknianIdeal - Sophia Jeffery
DarknianIdeal - Clyde Calderon
Frolicwas - Taylor Vargas
Reliable - Aryan Hess
DarknianIdeal - Liyah Navarro
Deservedness - Eadie Jefferson
Reliable - Angel Whitehouse
Choreography - Priya Oliver

输出应该如何:

Choreography - Imran Sullivan
Goodfella - Khalil Person
DarknianIdeal - Sophia Jeffery
Frolicwas - Taylor Vargas
Reliable - Aryan Hess
Deservedness - Eadie Jefferson

这是代码。我已将数据拆分为一个数组,以便我可以单独打印数据。

import java.util.*;
import java.io.*;

public class Task1 {
public static void main(String[] args) {
List<Person> personFile = new ArrayList<>();
Set<Person> splitUserNameList = new HashSet<>(personFile);

try {
BufferedReader br = new BufferedReader(new FileReader("person-data.txt"));
String fileRead = br.readLine();
while (fileRead != null) {
String[] personData = fileRead.split(":");
String personName = personData[0];
String userNameGenerator = personData[1];
String[] userNameSplit = userNameGenerator.split(",");
String newUserNameSplit = userNameSplit[0];
Person personObj = new Person(personName, newUserNameSplit);
splitUserNameList.add(personObj);
fileRead = br.readLine();
}
br.close();
}
catch (FileNotFoundException ex) {
System.out.println("File not found!");
}
catch (IOException ex) {
System.out.println("An error has occured: " + ex.getMessage());
}

for (Person userNames: splitUserNameList) {
System.out.println(userNames);
}
}
}

/* Person Class */

public class Person {
private String personName;
private String userNameGenerator;

public Person(String personName, String userNameGenerator) {
this.personName = personName;
this.userNameGenerator = userNameGenerator;
}

public String getPersonName() {
return personName;
}

public String getUserNameGenerator() {
return userNameGenerator;
}

@Override
public String toString() {
return userNameGenerator + " - " + personName;
}
}

最佳答案

您需要覆盖 equals and hashCode Person 对象上的方法,以便 Set 知道哪些对象被认为是相同的。

您似乎希望具有相同 userNameGenerator 字段的任何两个人都被视为平等。在这种情况下,以下将满足您的需求:

public class Person {
private String commonName;
private String userNameGenerator;

...

@Override
public int hashCode()
{
return userNameGenerator.hashCode();
}

@Override
public boolean equals(Object o)
{
if (this == o) return true;

if (this.getClass() != o.getClass()) return false;

final Person that = (Person) o;

return this.userNameGenerator.equals(that.userNameGenerator);
}
}

一些重要的注意事项:

  • 在重复的情况下,Set 只允许在第一个所以插入顺序变得很重要

  • 集合不应包含可变元素,因为可变性会破坏他们的内部一致性。你的 Person 类是不可变的(没有setters) 这很好,但你可能想要强制执行这种不可变性进一步声明它的所有字段 final

关于java - 删除文本文件中的 ArrayList 重复项 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47658094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com