有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java检查两个Arraylist条目是否具有相同的字段并求和

我知道这个标题可能有点让人困惑,但我现在就详细介绍一下。。。 我有一个叫做Dispatch的对象,这是它的代码

public class Dispatch {
    private string DispatchName;
    private double Weight;
    ...

我的用户将选择多个调度并输入它们的权重,单击按钮后,列表将被发送到服务器,但同时,我想将同一列表保存到另一个列表,我们称之为copyList

但是在添加到copyList之前,我想检查copyList中是否已经有一个项目与我要添加的项目具有完全相同的名称(^{)。如果有,那么只需将我要添加的权重添加到列表中。如果没有同名项目,则应添加整个项目

注意:我不能使用Java 8,因为我仅限于Android API 19。我知道stream是可能的,但我需要其他解决方案

我试过使用doubleforeach,但就是找不到解决方案


共 (2) 个答案

  1. # 1 楼答案

    正如评论中所建议的,试着实现Dispatch.equals如下:

    @Override
    public boolean equals(Object o) {
        boolean ret = false;
        if (this == o) {
            ret = true;
        } else if (o != null) && (getClass() == o.getClass()) {
            Dispatch d = (Dispatch)o;
            ret = Object.equals(DispatchName, d.DispatchName)
        }
        return ret;
    }
    

    另外,最好将代码更改为依赖Set(如HashSet<DispatchName>)并使用Set.contains()如:

    DispatchName d = ...
    if(hs.contains(d)) {
       DispatchName d2 = hs.get(d);
       hs.add(new DispatchName(d.DispatchName, d.Weight + d2.Weight);
    } else {
       hs.add(d);
    }
    
  2. # 2 楼答案

    我认为实现这一点的最佳方法是建立一套数据结构,它将允许您在无需解决问题的情况下管理重复值

    让我们看看列表和集合的两种方法:

    带列表:

    import java.util.List;
    
    public class Dispatcher implements Comparable<Dispatcher>{
    
        private String DispatchName;
        private double Weight;
    
        public String getDispatchName() {
            return DispatchName;
        }
        public void setDispatchName(String dispatchName) {
            DispatchName = dispatchName;
        }
        public double getWeight() {
            return Weight;
        }
        public void setWeight(double weight) {
            Weight = weight;
        }
    
        @Override
        public int compareTo(Dispatcher o) {
    
            if(this.getDispatchName().equals(o.getDispatchName()))
            return 0;
            return -1;
        }
    
        public static void compareDispatcher(List<Dispatcher> l , Dispatcher d){
    
            for(Dispatcher item : l){
                if(item.compareTo(d)==0)
                    item.setWeight(item.getWeight()+d.getWeight());
            }
        }
    
    }
    

    Note that the same logic of compareDispatcher should be used even for each insert in list to guarrantee unique logic objects .

    主要示例

    Dispatcher d1 = new Dispatcher();
            d1.setDispatchName("A");
            d1.setWeight(3L);
    
            Dispatcher d2 = new Dispatcher();
            d2.setDispatchName("B");
            d2.setWeight(1L);
    
            List<Dispatcher> l = new ArrayList<Dispatcher>();
    
            l.add(d1);
            l.add(d2);
    
    
            for(Dispatcher d : l){
                System.out.println(d.getDispatchName());
                System.out.println(d.getWeight());
                System.out.println("*************************");
            }
    
            System.out.println("++++++++++++++++++++++++++");
    
            Dispatcher d3 = new Dispatcher();
            d3.setDispatchName("A");
            d3.setWeight(2L);
    
            Dispatcher.compareDispatcher(l, d3);
    
            for(Dispatcher d : l){
                System.out.println(d.getDispatchName());
                System.out.println(d.getWeight());
                System.out.println("*************************");
            }
    
            System.out.println("end");
    

    与Set:

    这是最好的方法,因为实现hashcode等于保证在数据结构中看到唯一的对象

    import java.util.Set;
    
    public class Dispatcher implements Comparable<Dispatcher>{
    
        private String DispatchName;
        private double Weight;
    
        public String getDispatchName() {
            return DispatchName;
        }
        public void setDispatchName(String dispatchName) {
            DispatchName = dispatchName;
        }
        public double getWeight() {
            return Weight;
        }
        public void setWeight(double weight) {
            Weight = weight;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                    + ((DispatchName == null) ? 0 : DispatchName.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Dispatcher other = (Dispatcher) obj;
            if (DispatchName == null) {
                if (other.DispatchName != null)
                    return false;
            } else if (!DispatchName.equals(other.DispatchName))
                return false;
            return true;
        }
    
        @Override
        public int compareTo(Dispatcher o) {
    
            if(this.getDispatchName().equals(o.getDispatchName()))
            return 0;
            return -1;
        }
    
        public static void compareDispatcher(Set<Dispatcher> l , Dispatcher d){
    
            for(Dispatcher item : l){
                if(item.compareTo(d)==0)
                    item.setWeight(item.getWeight()+d.getWeight());
            }
        }
    
    }
    

    主要示例

    Dispatcher d1 = new Dispatcher();
            d1.setDispatchName("A");
            d1.setWeight(3L);
    
            Dispatcher d2 = new Dispatcher();
            d2.setDispatchName("B");
            d2.setWeight(1L);
    
            Dispatcher d4 = new Dispatcher();
            d4.setDispatchName("A");
            d4.setWeight(2L);
    
            Set<Dispatcher> l = new HashSet<Dispatcher>();
    
            l.add(d1);
            l.add(d2);
            l.add(d4);
    
            for(Dispatcher d : l){
                System.out.println(d.getDispatchName());
                System.out.println(d.getWeight());
                System.out.println("*************************");
            }
    
            System.out.println("++++++++++++++++++++++++++");
    
            Dispatcher d3 = new Dispatcher();
            d3.setDispatchName("A");
            d3.setWeight(2L);
    
            Dispatcher.compareDispatcher(l, d3);
    
            for(Dispatcher d : l){
                System.out.println(d.getDispatchName());
                System.out.println(d.getWeight());
                System.out.println("*************************");
            }
    
            System.out.println("end");
    

    Didn't add duplicate object :

    Dispatcher d4 = new Dispatcher();
      d4.setDispatchName("A");
      d4.setWeight(2L);