我需要小小的帮助。我有2个列表(比如A和B),它们具有用户定义类的对象。在java中进行列表操作所需的逻辑帮助
A和B都有一个方法getId(),它将返回一个整数(ID)。现在,我需要将列表A中每个对象的ID与列表B中的每个对象进行比较。如果ID相同,则必须将该对象从B替换为A.
如果从A对象不是在B,则我想补充一点,对象为B
请提供关于如何实现这一目标
感谢
我需要小小的帮助。我有2个列表(比如A和B),它们具有用户定义类的对象。在java中进行列表操作所需的逻辑帮助
A和B都有一个方法getId(),它将返回一个整数(ID)。现在,我需要将列表A中每个对象的ID与列表B中的每个对象进行比较。如果ID相同,则必须将该对象从B替换为A.
如果从A对象不是在B,则我想补充一点,对象为B
请提供关于如何实现这一目标
感谢
像这样的工作,假设你的清单是用一个索引来访问元素的可能性的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));
}
}
这requiers是在您的元素和b重载equals statment,这样他们就可以比较与彼此的ID
谢谢,但问题是假设列表A有{1,2,3}(考虑1,2,3是对象的id),而B有{5,6,7},现在将比较1 5并且它不会匹配并且将被添加到B,并且再次将1与6进行比较并且再次将它添加,并且它继续,如果B包含A的对象然后它必须被替换,我需要它与A,或者只是加上 – jeyaprakash 2012-04-03 06:38:04
哦,你说得对。一种解决办法是打破;在else语句中。这将打破内循环,这意味着第一个循环并将i设置为1。所以,如果你有你所说的a = {1,2,3}和b = {5,6,7},那么1就与5进行比较,不匹配,所以它给b加1,突破循环,现在2将与5比较,这是你想要的 – 2012-04-03 06:47:56
我真的appriciate你的帮助吉米,这是一个很好的逻辑,但有一个小的循环漏洞,如果假设b = {5,6,7,1},1将被检查与5,它会爆发。但是在第四位有一场比赛。 :( – jeyaprakash 2012-04-03 06:56:55
你为什么不到位名单的使用Hashtable的逻辑。您可以将ID作为每个对象的关键字。
假设ID对于涉及的对象是唯一的,这是一个很好的建议。 – user949300 2012-04-03 06:16:21
您应该使用的界面处的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
}
我假定的equals()不被覆盖:
public interface Identity {
public long getID();
}
现在我们做的伎俩,以两个列表同步为你的对象!
我创建的示例程序。希望这可能有所帮助。
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;
}
}
但是,使用地图是可取的!
我试过这个http://stackoverflow.com/questions/9977658/concurrentmodificationexception-help-in-iterator#comment12748686_9977658 – jeyaprakash 2012-04-03 06:03:20
但问题是它检查A中的每个对象与B中的所有对象,如果它不相同,它将一次又一次地添加对象 – jeyaprakash 2012-04-03 06:05:35
我只想看看B是否包含A中的当前对象,如果是,那么用这个替换这个对象只需添加它 – jeyaprakash 2012-04-03 06:06:32