arraylist中的重复项不能打印

时间:2014-09-21 13:24:49

标签: java arraylist

我有一个银行顾客的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。

5 个答案:

答案 0 :(得分:2)

将所有元素添加到Set

for (Customer c: new HashSet<Customer>(customers)) {                    

来自链接的Javadoc:

  

不包含重复元素的集合

答案 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类已按照您的预期方式实施hashCodeequals,则可以使用Set

 Set<Customer> uniqueCustomers = new HashSet<Customer>(customers);

如果您需要保持List中元素的原始顺序,请使用LinkedHashSet

Set<Customer> uniqueOrderedCustomers = new LinkedHashSet<Customer>(customers);

如果Customer类没有实现hashCodeequals,或者您无法实现它,因为您没有来源,请使用{{ 3}}并实现Comparator

答案 3 :(得分:0)

最理想的是,您需要在showCustomers()方法中创建并行数组。

让数组包含相对boolean值。

for(Customer c: customers)次迭代中创建(嵌套)条件语句(ifelse)。

在条件内,获取并行数组的第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 的情况下,如果那里有一个副本,它用新的值替换旧的值。