我有一个银行顾客的arraylist。有些客户不止一次出现(如果他们有多个帐户,就会发生这种情况)。
现在我想要打印所有客户,但如果不止一次出现我只想打印一次。
Heres是我的非工作代码。现在它打印整个列表。如何添加代码只打印重复一次?
public void showCustomers() {
private ArrayList<Customer> customers = new ArrayList<Customer>();
for(Customer c: customers) {
System.out.println("First name: " + c.getFirstname());
System.out.println("Last name: " + c.getLastname());
System.out.println("Customer number: " + c.getNumber());
for(Account a : c.getAccounts()) {
System.out.println("Account number: " + a.getAccountId());
}
}
}
我不喜欢使用HashSet(如果它不是必需的)。我现在正在尝试学习ArrayLists。
答案 0 :(得分:2)
答案 1 :(得分:2)
每当您需要避免重复时,请考虑Set
List<String> lst = Arrays.asList("Foo", "Foo", "Bar", "Baz");
for(String s : new HashSet<>(lst)) {
System.out.println(s);
}
答案 2 :(得分:2)
如果Customer
类已按照您的预期方式实施hashCode
和equals
,则可以使用Set
。
Set<Customer> uniqueCustomers = new HashSet<Customer>(customers);
如果您需要保持List
中元素的原始顺序,请使用LinkedHashSet
Set<Customer> uniqueOrderedCustomers = new LinkedHashSet<Customer>(customers);
如果Customer
类没有实现hashCode
和equals
,或者您无法实现它,因为您没有来源,请使用{{ 3}}并实现Comparator
。
答案 3 :(得分:0)
最理想的是,您需要在showCustomers()
方法中创建并行数组。
让数组包含相对boolean
值。
在for(Customer c: customers)
次迭代中创建(嵌套)条件语句(if
,else
)。
在条件内,获取并行数组的第n个索引处的值。
如果当前值为false
,请将其设置为true
并打印到控制台。
如果当前值为true
,则调用continue
语句使迭代转到下一个项目(而不是打印到控制台)。
以下内容将打印重复或多个条目的第一个Customer
:
public void showCustomers() {
// Visibility of variables in class methods is irrelevant
// All variables/values created within a method will only be
// accessible from within it's scope
/*private*/ ArrayList<Customer> customers = new ArrayList<Customer>();
// Create a parallel list
List<Boolean> customers_b = new ArrayList<Boolean>(customers.size());
// Use this value to hold the index of your current item
int n = 0;
for(Customer c: customers) {
if(customers_b.get(n) == false)
{
System.out.println("First name: " + c.getFirstname());
System.out.println("Last name: " + c.getFirstname());
System.out.println("Customer number: " + c.getNumber());
for(Account a : c.getAccounts()) {
System.out.println("Account number: " + a.getAccountId());
}
customers_b.set(n, true);
n++;
}
else
{
n++;
continue;
}
}
}
答案 4 :(得分:0)
将您的列表转换为 Hashset ,这样就可以解决问题,因为hashsets不允许存储重复值,但是在 HashMap 的情况下,如果那里有一个副本,它用新的值替换旧的值。