Получите ArrayList, содержащий объединение двух разных размеров массива некоторого типа объекта - PullRequest
0 голосов
/ 03 июля 2011

У меня есть класс bean-компонентов, содержащий две переменные Title и ID.

public class Bean(){
    private String title;
    private String ID;
}

У меня также есть два массива типа Bean - ArrayList firstList и ArrayList secondList.Оба имеют разное количество элементов Bean, то есть размер двух массивов различен, и они могут быть огромными по размеру.Некоторые из присутствующих в них элементов Bean могут содержать одинаковые идентификаторы.

Теперь у меня есть другой класс Bean MainBean, содержащий три переменные

public class Mainbean(){
    private String firstTitle;
    private String secondTitle;
    private String ID;
}

Мне нужно создать новый ArrayList типа MainBean на основедля значений из двух вышеуказанных массивов - ArrayList finalList.

При сравнении двух вышеуказанных массивов (firstList и secondList) необходимо учитывать следующее:

1) Первое условие - еслиодин и тот же идентификатор присутствует в обоих списках, тогда новый ArrayList finalList будет иметь заполненный идентификатор, а firstTitle из firstList и secondTitle из secondList.

2) Если идентификатор из firstList отсутствует в secondListfinalList будет иметь идентификатор и firstTitle из firstList, а secondTitle будет нулевым.

3) Если идентификатор из secondList отсутствует в firstList, finalList будет иметь идентификатор и secondTitle из secondList, а firstTitleбудет нулевым.

Пожалуйста, помогите мне сформировать такой финальный списокArrayList.

Ответы [ 3 ]

2 голосов
/ 03 июля 2011

Идея состоит в том, чтобы использовать процедуру слияния mergesort. Итак, вы сначала сортируете оба списка, а затем объединяете их в один, используя указанные вами условия. Код после сортировки будет (более или менее):

i = 0;
j = 0;
while (i < m && j < n) {
  Bean b1 = firstList.get(i);
  Bean b2 = secondList.get(j);
  int id1 = b1.getID();
  int id2 = b2.getID();
  if (id1 < id2) { // id2 is bigger, get from firstList, increment i
    finalList.add(new MainBean(id1,b1.getTitle(),null);
    i++;
  } else if (id1 > id2) { // id1 is bigger, get from secondList, increment j
    finalList.add(new MainBean(id2,null,b2.getTitle()));
    j++;
  } else { // both are the same, get from both, increment both
    finalList.add(new MainBean(id1,b1.getTitle(),b2.getTitle()));
    i++;
    j++;
  }
}
while (i < m) { // take the rest of firstList
  Bean b = firstList.get(i);
  finalList.add(new MainBean(b.getID(),b.getTitle(),null));
  i++;
}
while (j < n) { // take the rest of secondList
  Bean b = secondList.get(j);
  finalList.add(new MainBean(b.getID(),null,b.getTitle()));
  j++;
}

Примечание:

  • m = firstList.length ();
  • n = secondList.length ();
  • Я предполагаю, что finalList был инициализирован перед выполнением этой процедуры
2 голосов
/ 03 июля 2011

Чтобы сделать это эффективно, вам нужно использовать HashMap.

ArrayList<Mainbean> result = new ArrayList<Mainbean>();
HashMap<String, Mainbean> bean_by_id = new HashMap<String, Mainbean>();

// first list: all are new element
for(Bean b : firstList)
{
    // if you do not have constructor (ID, title1, title2):
    Mainbean mb = new Mainbean(){{ this.ID = b.ID; this.firstTitle = b.title; }};
    result.add(mb);
    bean_by_id.put(mb.ID, mb);
}

for(Bean b : secondList)
{
    Mainbean mb = bean_by_id.get(b.ID);
    if (mb==null)
    {
        mb = new Mainbean(){{ this.ID = b.ID; this.secondTitle = b.title; }};
        result.add(mb);
    }
    else mb.secondTitle = b.title;
}
0 голосов
/ 03 июля 2011

То, что вы описываете, - это реляционное соединение, в частности полное внешнее соединение.Два опубликованных решения по сути являются двумя стандартными методами, которые СУБД использует для выполнения объединений - объединение слиянием и соединение с хешем.Так что (а) оба из них являются вполне разумными способами решения проблемы, но (б) возникает вопрос, будет ли вам лучше использовать серверную часть базы данных и позволить ей выполнять соединения за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...