2015-06-10 2 views
2

Я пытаюсь объединить несколько списков строк.Как объединить элементы по одному и тому же индексу из отдельных списков?

Скажем, у меня есть два (может быть и больше) списки одного и того же размера:

List<String> list1 = Arrays.asList("1One","1Two","1Three"); 
List<String> list2 = Arrays.asList("2One","2Two","2Three"); 

Я хочу, чтобы объединить значения соответствующих показателей и поместить их в новый список:

List3 = new {"1One2One", "1Two2Two", "1Three2Three"}; 

В настоящее время у меня есть список из 2 объектов, каждый объект содержит список, в котором я хочу объединить элементы внутри.

Так что я хочу, чтобы объединить элемент 1 в списке из объекта 1 с элементом 1 из списка от объекта 2.

Это то, что я пытался:

public void generateFileList(List<Object> cl){ 


    int count = 0; 
    String temp = ""; 
    for(int i = 0; i < cl.size(); i++){ 

     for (int x = 0; x < cl.get(i).getItemList().size(); x++) { 
      if (count == x){ 
       temp += cl.get(i).getListItem(x); 
       break; 
      } 

     } 
     count++; 
     textList.add(temp); 

    } 
} 
public void test(){ 
    for(String s : textList){ 
     System.out.println("List Element - " + s); 
    } 
    System.out.println(textList.size()); 
} 

, которая печатает:

List Element - 1One 
List Element - 1One1Three 

Что я здесь делаю неправильно?

+1

Ваш код Безразлично 't соответствует описанию. Где 'list1' и' list2'? почему они не используются в методе 'generatedFileList' –

+0

Весь ваш алгоритм неверен. –

+0

Вы работаете с 2D-списком или двумя списками? Что-то не соответствует вашему коду и тому, что вы просите. – JNYRanger

ответ

1

Во-первых, код, который у вас есть, не будет компилироваться. Оно должно быть:

List<String> list1 = Arrays.asList("1One","1Two","1Three"); 
List<String> list2 = Arrays.asList("2One","2Two","2Three"); 

Далее, то лучше использовать Iterator, чем доступ к List по индексу:

public List<String> concat(final List<String> list1, final List<String> list2) { 
    final Iterator<String> i1 = list1.iterator(); 
    final Iterator<String> i2 = list2.iterator(); 

    final List<String> combined = new ArrayList<>(); 
    while (i1.hasNext() && i2.hasNext()) { 
     combined.add(i1.next() + i2.next()); 
    } 
    return combined; 
} 

Для произвольного числа List:

public List<String> concat(final List<String>... lists) { 
    final List<Iterator<String>> it = new LinkedList<>(); 
    for (List<String> l : lists) { 
     it.add(l.iterator()); 
    } 

    final List<String> combined = new ArrayList<>(); 
    outer: 
    while (true) { 
     final StringBuilder sb = new StringBuilder(); 
     for (final Iterator<String> i : it) { 
      if (!i.hasNext()) { 
       break outer; 
      } 
      sb.append(i.next()); 
     } 
     combined.add(sb.toString()); 
    } 
    for (final Iterator<String> i : it) { 
     if (i.hasNext()) { 
      throw new IllegalArgumentException("Lists not the same length."); 
     } 
    } 
    return combined; 
} 
+0

Что делать, если у меня есть более двух объектов? – crm

+0

Вы сказали, что это было «2». Теперь вы меняете вопрос? –

+0

Я думаю, что у него есть какой-то список объектов, где каждый объект содержит 2 списка ... не очень понятно ... – blazetopher

1

Если списки имеют одинаковый размер, просто укажите цикл от 0 до размера списка и добавьте в новый список конкатенацию элементов из одной позиции в двух списках, например, для (int i = 0 ; я < list1.size(); я ++) {resultedlist.add (list1.get (я) + list2.get (я))}

0

предполагающее 2 перечислены имеют одинаковый размер:

List<String> list1 = new {"1One","1Two","1Three"}; 
List<String> list2 = new {"2One","2Two","2Three"}; 
List<String> list3 = new ArrayList<>(); 
for (int i = 0; i < list1.size(); i++) { 
    list3.add(list1.get(i) + list2.get(i)); 
} 
+0

Доступ к индексу «Список» по индексу - ужасная идея. Кроме того, код, который вы скопировали, не компилируется. –

+0

yes, имел оговорку о назначении. Почему доступ к «списку» по индексу - плохая идея? – blazetopher

+0

Что делать, если у меня есть более 2 объектов? – crm

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