2015-02-06 3 views
0

У меня есть два списка, содержащие объекты того же типа. Каждый объект имеет int, строку и некоторые другие вещи, где int - его индекс.Объединить два списка по индексу

Вот объект, оба список держит:

public class ListElement 
{ 
    private int index; 
    private String data; 
    private String some; 
    private String other; 
    private String stuff; 

    // gets, sets... 

} 

Что я хочу взять индекс списка A, и «некоторые другие вещи» и заменить его строку «данные» с одним из списка B. Тот, который он принимает из списка B, должен соответствовать индексу List A. Надеюсь, это понятно.

EDIT: Следует отметить, что индекс int внутри объекта не имеет ничего общего с фактическим положением объекта в списке. Его для других porpuses

+0

Так вложенные в петли? Перейдем через ListA, найдите соответствующий элемент ListB (если есть) и выполните операцию. – ryanyuyu

+0

Если мы хотим, чтобы индексы соответствовали друг другу, вложение не должно быть необходимым. – fzzfzzfzz

+1

Является ли это индексом относительно его содержащего массива или просто совпадающим полем int, называемым индексом? – ryanyuyu

ответ

2

ОБНОВЛЕНИЕ: Вы упомянули, что поле index вашего ListElement не имеет отношения к его фактическому месту в его содержащем списке.

У вас просто есть поле со случайным именем, которое вы хотите сравнить с обоими списками (присоединитесь). Это решение использует вложенные циклы для сравнения каждого элемента в одном списке с каждым элементом в другом списке.

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 
     }   
    } 
} 
1

Если предположить, что оба списка имеют одинаковое число элементов, вы могли бы сделать что-то вроде:

ListElement sourceElement, destElement; 
for (int i =0; i<list1.size(); i++) { 
    sourceElement = list1.get(0); 
    destElement = list2.get(0); 
    sourceElement.setData(destElement.getData()); 
    ... 
} 
0

Если вы хотите, чтобы соответствовать на index поля на ListItem объект, попробуйте это:

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()); 
} 
1

Первая идея, вероятно, не самая яркая, но я приду к ней позже.

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 с тем же индексом.

Смежные вопросы