java中列表操作所需的逻辑帮助

java中列表操作所需的逻辑帮助,java,algorithm,oop,list,Java,Algorithm,Oop,List,我需要一些帮助。我有两个列表(比如A和B),其中包含用户定义类的对象 A和B都有一个方法getId(),该方法将返回一个整数(ID)。现在,我需要将列表A中每个对象的ID与列表B中每个对象的ID进行比较。如果ID相同,那么我必须将列表B中的对象替换为列表A中的对象 如果A中的对象id不在B中,那么我会将该对象添加到B中 请给我一个如何实现这一目标的逻辑 谢谢为什么不用哈希表代替列表呢。可以将ID作为每个对象的键 您应该为getID()方法使用一个接口: 现在我们要做的是同步两个列表: priva

我需要一些帮助。我有两个列表(比如A和B),其中包含用户定义类的对象

A和B都有一个方法getId(),该方法将返回一个整数(ID)。现在,我需要将列表A中每个对象的ID与列表B中每个对象的ID进行比较。如果ID相同,那么我必须将列表B中的对象替换为列表A中的对象

如果A中的对象id不在B中,那么我会将该对象添加到B中

请给我一个如何实现这一目标的逻辑


谢谢

为什么不用哈希表代替列表呢。可以将ID作为每个对象的键

您应该为getID()方法使用一个接口:

现在我们要做的是同步两个列表:

private List<Identity> listA = new ArrayList();
private List<Identity> listB = new ArrayList();

private void syncLists() {
    final Map<Long, Identity> map = new HashMap();

    // add all elements of list b
    for ( Identity element : this.listB ) {
        map.put( element.getID(), element );
    }

    // add all elements of list a, overwrite the existing ones of b
    for ( Identity element : this.listA ) {
        map.put( element.getID(), element );
    }

    // write the elements of the map back into the lists
    this.listA = new ArrayList( map.values() );
    this.listB = new ArrayList( map.values() );
    // list a contains the same references as list b now
}
private List listA=new ArrayList();
private List listB=new ArrayList();
私有void同步列表(){
final Map=new HashMap();
//添加列表b的所有元素
for(标识元素:this.listB){
put(element.getID(),element);
}
//添加列表a的所有元素,覆盖列表b的现有元素
for(标识元素:this.listA){
put(element.getID(),element);
}
//将映射的元素写回到列表中
this.listA=新的ArrayList(map.values());
this.listB=新的ArrayList(map.values());
//现在列表a包含与列表b相同的引用
}

我假设equals()不会被对象覆盖

如果列表是一个可以通过索引访问元素的arrayList,那么类似这样的方法是可行的

for(int i=0;i<a.size();i++)
    for(int j=0;j<b.size();j++)
       if(a.get(i).getId().equals(b.get(j).getId()){
         //this id from A exists in B. Replace
         b.get(j)=a.get(i);
       }
       else{
          if(j=(b.size()+1)){ // if true the whole b list have been searched
             //object not found. Add it to b
             b.add(a.get(i));      
          } 
}

for(inti=0;i我创建的示例程序。希望这可能会有所帮助

public static void main(String[] args) {
    List<User> A = new ArrayList<User>();
    List<User> B = new ArrayList<User>();
    A.add(new User(1, "A1"));
    A.add(new User(2, "A2"));
    A.add(new User(3, "A3"));

    B.add(new User(1, "B1"));
    B.add(new User(4, "B4"));
    B.add(new User(5, "B5"));

    for (int i = 0; i < A.size(); i++) {
        for (int j = 0; j < B.size(); j++) {
            if (A.get(i).getId() == B.get(j).getId()) {
                B.remove(j);
                B.add(j, A.get(i));
            } else {
                if (!B.contains(A.get(i))) {
                    B.add(A.get(i));
                }
            }
        }
    }
    System.out.println("-----Finally------");
    for (User u : A)
        System.out.println("From A-->" + u.getName());
    for (User u : B)
        System.out.println("From B-->" + u.getName());

}
}


但是使用Map是可取的!!!

我已经尝试过了,但问题是它正在检查A中的每个对象和B中的所有对象,如果不一样,它会再次添加对象,againi只想看看B是否包含A中的当前对象如果是,那么用这个替换该对象it@SimonC有什么办法吗假设ID对于所涉及的对象是唯一的,这是一个很好的建议。谢谢,但问题是假设列表A有{1,2,3}(假设1,2,3是对象的ID),而B有{5,6,7},现在将1与5进行比较,它将不匹配,并将被添加到B中,再次将1与6进行比较,并再次添加,然后继续,我需要它,如果B包含A的对象,则必须将其替换为A,否则只需添加哦,您在这一点上是正确的。一种解决方案是中断;在else语句中。这将是打破内部循环,这意味着第一个循环,将i设置为1。那么,如果你有如你所说的a={1,2,3}和b={5,6,7}然后1与5进行比较,没有匹配,因此它将1与b相加,打破循环,现在2将与5进行比较,这是您真正想要感谢您的帮助吉米,这是一个很好的逻辑,但是有一个小的循环洞,如果假设b={5,6,7,1},1将与5进行检查,它将打破循环。但是在第四个位置有一个匹配(如果我们可以在continue语句不匹配的情况下尝试使用它,并且在到达列表末尾后,我们可以将它添加到列表中吗???在else语句中添加另一个if:if(j=(b.size()+1)),然后执行b.add和break。这将确保j列表已到达其最后一个元素
public static void main(String[] args) {
    List<User> A = new ArrayList<User>();
    List<User> B = new ArrayList<User>();
    A.add(new User(1, "A1"));
    A.add(new User(2, "A2"));
    A.add(new User(3, "A3"));

    B.add(new User(1, "B1"));
    B.add(new User(4, "B4"));
    B.add(new User(5, "B5"));

    for (int i = 0; i < A.size(); i++) {
        for (int j = 0; j < B.size(); j++) {
            if (A.get(i).getId() == B.get(j).getId()) {
                B.remove(j);
                B.add(j, A.get(i));
            } else {
                if (!B.contains(A.get(i))) {
                    B.add(A.get(i));
                }
            }
        }
    }
    System.out.println("-----Finally------");
    for (User u : A)
        System.out.println("From A-->" + u.getName());
    for (User u : B)
        System.out.println("From B-->" + u.getName());

}
class User {
public int id;
public String name;

User(int id, String name) {
    this.id = id;
    this.name = name;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}