【问题标题】:Adding values of repeated elements in ArrayList在 ArrayList 中添加重复元素的值
【发布时间】:2012-10-22 07:33:30
【问题描述】:

我有一个Arraylist 的记录。

package com.demo.myproject;

public class Records 
{
    String countryName;
    long numberOfDays;

    public String getCountryName() {
        return countryName;
    }
    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }
    public long getNumberOfDays() {
        return numberOfDays;
    }
    public void setNumberOfDays(long numberOfDays) {
        this.numberOfDays = numberOfDays;
    }

    Records(long days,String cName)
    {
        numberOfDays=days;
        countryName=cName;
    }
}

我的Arraylist<Records> 包含值

 Singapore     12 
 Canada         3
 United Sates  12
 Singapore     21

我需要修改它以便我的输出是

Canada         3
Singapore     33
United States 12

请帮我解决办法。

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可以将您的记录存储在地图中,其中关键是国家/地区。

    当你收到一条新记录时,检查国家是否已经在地图中,如果是,添加天数,如果没有创建它。

    Map<String, Record> map = new HashMap<String, Record> ();
    
    addRecord(map, someRecord);
    
    private void addRecord(Map<String, Record> map, Record record) {
        Record inMap = map.get(record.getCountryName());
        if (inMap == null) {
            inMap = record;
        } else {
            inMap.setNumberOfDays(inMap.getNumberOfDays() + record.getNumberOfDays());
        }
        map.put(record.getCountryName(), inMap);
    }
    

    注意事项:

    • 我认为可以修改记录 - 如果不只是使用天数的总和创建一个新记录。
    • 您仍然可以通过调用map.values(); 获取记录集合并对其进行迭代
    • ArrayList 不太适合您的用例。如果您确实需要坚持使用 ArrayList,对于每条新记录,您需要遍历列表,检查列表中的一条记录是否与新记录具有相同的国家,如果找到则更新该记录,或者如果没有,请添加新记录。

    【讨论】:

    • 我已经按照应用程序中的 ArrayList 完成了所有操作。任何有助于修改 ArrayList 的建议将不胜感激
    • 集合 c = map.values();迭代器 itr = c.iterator(); while(itr.hasNext()){ System.out.println("排序的记录是 "+itr.next());我在 10-22 13:25:45.132: I/System.out(7129): SORTED RECORDS ARE com.demo.myproject.Records@40525cb8 请帮忙
    • 什么是 ArrayList 更好的方法/替代方法。
    • 如果你真的想使用 ArrayList,你有 2 个简单的解决方案: 1. 如果在添加对象之前不需要真正优化(那里没有很多对象),只需制作一个for 循环,看看是否已经有一个同名的。它与 HashMap 的解决方案相同,但不是简单的 HashMap.get() 您有一个 for 循环,您可以在找到元素时中断该循环。解决方案 2. 当您需要超高速时,您可以使用普通的 arraylist 和 hashmap 来保存 String 以仅索引。在添加到 ArrayList 之前,首先检查 HashMap 中是否已经存在一个。
    • @onkar 如果您想要按国家/地区排序的记录,请将我的示例中的 HashMap 替换为 TreeMap(没有其他变化)。为了使记录打印得很好,您需要覆盖 toString 方法 - 参见例如:stackoverflow.com/questions/10503964/…
    【解决方案2】:
    public class RecordsMain {
    
        static ArrayList<Records> al = new ArrayList<Records>();
        static boolean flag = false;
    
        public static void main(String[] args) {
            Records rec1 = new Records(12,"Singapore");
            Records rec2 = new Records(3,"Canada");
            Records rec3 = new Records(12,"United States");
            Records rec4 = new Records(21,"Singapore");
    
            addToList(rec1);
            addToList(rec2);
            addToList(rec3);
            addToList(rec4);
    
            for (int i = 0; i < al.size(); i++) {     
                System.out.println(al.get(i).getCountryName() + " :: " + al.get(i).getNumberOfDays());
            }
        }
    
        public static void addToList(Records records) {
            for (int i = 0; i < al.size(); i++) {     
                if(al.get(i).getCountryName().equals(records.getCountryName())) {
                    al.get(i).setNumberOfDays(al.get(i).getNumberOfDays()+records.getNumberOfDays());
                    flag=true;
                }
            }
            if (flag == false)
                al.add(records);
        }
    }
    

    注意:

    • 函数addToList 添加记录,并在添加自身时检查CountryNames 是否重复,如果重复,则添加天数并且不会将任何新条目标记到ArrayList
    • 我不确定您是否也在寻找List 的排序,因此没有尝试。

    【讨论】:

      【解决方案3】:

      我想您自己创建这些记录。如果您不需要任何特定的元素顺序,您应该使用 HashMap 并且正如 assylias 所说 - 仅在它们不存在时创建国家元素。当您需要保持元素的顺序(或稍后按名称等对其进行排序)时,您仍然可以使用 ArrayList 和“indexOf()”方法轻松找到它们。

      【讨论】:

        【解决方案4】:

        我不知道你究竟想在那里做什么,但如果你想用特定标准对其进行排序,那么你可以使用可比较或比较器接口使用 ArrayList 中的标准对记录进行排序并使用 collections.sort() 方法进行排序它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-03
          • 1970-01-01
          • 2012-03-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多