合并索引上的两个列表
Merge two lists on index
我有两个包含相同类型对象的列表。每个对象都有一个 int、一个字符串和其他一些东西,其中 int 是它的索引。
这是两个列表都包含的对象:
public class ListElement
{
private int index;
private String data;
private String some;
private String other;
private String stuff;
// gets, sets...
}
我想要的是获取列表 A 的索引和 "some other stuff" 并将其字符串 "data" 替换为列表 B 中的字符串。它从列表 B 中获取的字符串应与列表 A 的索引匹配.我希望这是可以理解的。
编辑:需要注意的是,对象内部的索引int与列表中对象的实际位置无关。它是给其他海豚的
假设你的两个列表有相同数量的元素,你可以这样做:
ListElement sourceElement, destElement;
for (int i =0; i<list1.size(); i++) {
sourceElement = list1.get(0);
destElement = list2.get(0);
sourceElement.setData(destElement.getData());
...
}
如果你想匹配 ListItem
对象的 index
字段,试试这个:
for (ListItem listItemA : listA) {
for (ListItem listItemB : listB) {
if (listItemB.getIndex() == listItemA.getIndex()) {
listItemA.setData(listItemB.getData());
}
}
}
如果您有兴趣根据 List
对象中的索引进行匹配,请尝试
for (int i = 0; i < listA.size(); i++) {
listA.get(i).setData(listB.get(i).getData());
}
更新:您提到 ListElement
的 index
字段与其在包含列表中的实际位置无关。
您恰好有一个随机名称的字段,您想要比较两个列表(加入)。此解决方案使用嵌套循环将一个列表中的每个元素与另一个列表中的每个元素进行比较。
for (int iA = 0; iA < listA.size(); iA++) //iterate over listA
{
ListElement currentElement = listA.get(iA);
for (int iB = 0; iB < listB.size(); iB++) //iterate over listB
{
ListElement other = listB.get(iB);
if (other.index == currentElement.index) //compare the elements
{
//do stuff
currentElement.setData(other.getData());
break; //if only want first match
}
}
}
第一个想法可能不是最聪明的,但我稍后会谈到。
For (ListElement e : ListA) {
For (ListElement le : ListB) {
if (e.getIndex() = le.getIndex()) {
e.setData(le.getData());
}
}
}
所以这是我对您所写内容的第一次尝试,但这可能不是最简单的方法。为了使其更简单和更快,您可以实现接口 Comparable
并使用 sort,在这种情况下,您可以通过 ListElement 中的索引访问列表元素(假设您确保索引从 1..n 开始完成).
我最喜欢的解决方案是使用某种 maps 将索引存储为键,将 ListElement 存储为值,然后它只是 MapA.get(i).setData(MapB.get(i).getData())
这是愚蠢的证明,只要对于 MapA 中的每个项目MapB 中有一个具有相同索引的相应项。
我有两个包含相同类型对象的列表。每个对象都有一个 int、一个字符串和其他一些东西,其中 int 是它的索引。
这是两个列表都包含的对象:
public class ListElement
{
private int index;
private String data;
private String some;
private String other;
private String stuff;
// gets, sets...
}
我想要的是获取列表 A 的索引和 "some other stuff" 并将其字符串 "data" 替换为列表 B 中的字符串。它从列表 B 中获取的字符串应与列表 A 的索引匹配.我希望这是可以理解的。
编辑:需要注意的是,对象内部的索引int与列表中对象的实际位置无关。它是给其他海豚的
假设你的两个列表有相同数量的元素,你可以这样做:
ListElement sourceElement, destElement;
for (int i =0; i<list1.size(); i++) {
sourceElement = list1.get(0);
destElement = list2.get(0);
sourceElement.setData(destElement.getData());
...
}
如果你想匹配 ListItem
对象的 index
字段,试试这个:
for (ListItem listItemA : listA) {
for (ListItem listItemB : listB) {
if (listItemB.getIndex() == listItemA.getIndex()) {
listItemA.setData(listItemB.getData());
}
}
}
如果您有兴趣根据 List
对象中的索引进行匹配,请尝试
for (int i = 0; i < listA.size(); i++) {
listA.get(i).setData(listB.get(i).getData());
}
更新:您提到 ListElement
的 index
字段与其在包含列表中的实际位置无关。
您恰好有一个随机名称的字段,您想要比较两个列表(加入)。此解决方案使用嵌套循环将一个列表中的每个元素与另一个列表中的每个元素进行比较。
for (int iA = 0; iA < listA.size(); iA++) //iterate over listA
{
ListElement currentElement = listA.get(iA);
for (int iB = 0; iB < listB.size(); iB++) //iterate over listB
{
ListElement other = listB.get(iB);
if (other.index == currentElement.index) //compare the elements
{
//do stuff
currentElement.setData(other.getData());
break; //if only want first match
}
}
}
第一个想法可能不是最聪明的,但我稍后会谈到。
For (ListElement e : ListA) {
For (ListElement le : ListB) {
if (e.getIndex() = le.getIndex()) {
e.setData(le.getData());
}
}
}
所以这是我对您所写内容的第一次尝试,但这可能不是最简单的方法。为了使其更简单和更快,您可以实现接口 Comparable
并使用 sort,在这种情况下,您可以通过 ListElement 中的索引访问列表元素(假设您确保索引从 1..n 开始完成).
我最喜欢的解决方案是使用某种 maps 将索引存储为键,将 ListElement 存储为值,然后它只是 MapA.get(i).setData(MapB.get(i).getData())
这是愚蠢的证明,只要对于 MapA 中的每个项目MapB 中有一个具有相同索引的相应项。