2016-08-02 2 views
0

У меня есть два отдельных списка массивов. Например:merge 2 ArrayLists на основе общей переменной

array1 = [[1 2 3 4 5 6]] 
array2 = [[3 7 8 9 10 11 16]] 

Я хочу иметь ArrayList, как показано ниже:

arrayResult = [[1 2 3 7 8 9 10 11 16]] 

Существует взаимная переменная на двух ArrayLists, и я хочу, чтобы иметь первую часть array1 + вторая часть массив2 в новый арраист.

+0

Нет коллекций, разрешенных, не так ли? –

+0

что вы понимаете под коллекцию ?! нет никакой разницы! @ ΦXocę 웃 Пepeúpa ツ – Ebola

+0

Для этого вы можете использовать 'TreeSet'. Что позволяет избежать дублирования и хранить данные в отсортированной форме – Kaushal28

ответ

0

петля Как раз над первой List и проверить значение на каждый индекс первого List за существование во втором List. Если значение не существует, добавьте первое значение List, если оно существует, затем скопируйте оставшиеся значения со второго List.

List<Integer> l1 = Arrays.asList(1,2,3,4,5,6); 
List<Integer> l2 = Arrays.asList(3,7,8,9,10,11,16); 
List<Integer> l3 = new ArrayList<Integer>();//joined List 
for (int i = 0; i < l1.size(); i++){ 
    int index = l2.indexOf(l1.get(i)); 
    if (index == -1){ 
     l3.add(l1.get(i)); 
    }else{ 
     for (int j = index; j < l2.size(); j++){ 
      l3.add(l2.get(j)); 
     } 
     break; 
    } 
} 
+0

Вы можете сделать 'l3.addAll (l2.subList (index, l2.size()))' без цикла for также и использовать расширенный цикл for над 'l1'. – Tunaki

0

Это проблема с вопросом о слиянии. Попробуйте применить алгоритм сортировки слиянием. Проверьте это для большей ясности и код оснастки: Merge Sort

Else попробовать это:

List<Integer> list1 = Arrays.asList(array1); 

List<Integer> list2 = Arrays.asList(array2); 

set.addAll(list1); 
set.addAll(list2); 

yourResult = set.toArray(); 
+0

Неправильно! – Kaushal28

+0

Проблема не в сортировке - она ​​включает в себя части каждого списка, соединяющие их в точке пересечения, определяемой индексом равных значений. – copeg

0

Вы можете сделать что-то вроде этого:

List<Integer> a1 = Arrays.asList(1, 2, 3, 4, 5, 6); 
List<Integer> a2 = Arrays.asList(3, 7, 8, 9, 10, 11, 16); 
ArrayList<Integer> merged = new ArrayList<>(); 
for(Integer val: a1){ 
    if(val == a2.get(0)){ 
     for(Integer val2: a2){ 
      merged.add(val2); 
     } 
     break; 
    } 
    merged.add(val); 
} 
System.out.println(merged); 

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

0

Петля через элементы массива1 и каждый раз проверяйте, находятся ли они в массиве2. Если нет, добавьте их и продолжите цикл array1. Если он существует в массиве2, остановите цикл array1 и начните цикл array2 в этом индексе.

Это должно помочь ..

Boolean found = false; 
integer foundInd = 0; 
Boolean useArray1 = false; 
if (array1.length >= array2.length) 
    useArray1 = true 

For (integer cnt1 = 0; cnt1 < array1.length; cnt1 ++) 
{ 
    For (integer cnt2 = 0; cnt2 < array2.length; cnt2 ++) 
    { 
     if (array1[cnt1] == array2[cnt2]) 
     { 
      found = true; 
      foundInd = cnt2; 
     } 
    } 
    if (useArray1 == false) 
     Array2[cnt] = Array1[cnt]; 
    if (found == true) 
     break; 
} 

For (integer cnt2 = foundInd; cnt2 < array2.length; cnt2 ++) 
{ 
    if (useArray1 == true) 
     useArray1[foundInd + cnt2] = array2[cnt2]; 
} 

Side Примечание- Вместо того, чтобы создавать новый массив для хранения значений, я просто использовал либо array1 или array2 в зависимости от того, который был длиннее. Он будет иметь правильную длину, и по крайней мере половина его данных уже будет правильным числом в правильном месте.

0

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

взгляд на этот пример:

public static void main(String[] args) { 
List<Integer> a1 = Arrays.asList(1, 2, 3, 4, 5, 6); 
List<Integer> a2 = Arrays.asList(3, 7, 8, 9, 10, 11, 16); 
List<Integer> common = new ArrayList<>(); 
int commonw; 
// merge both and find common Element.class.. 
// IllegalMonitorStateException must be one 
common.addAll(a1); 
common.retainAll(a2); 
commonw = common.get(0); 
common.clear(); 

// fill the common elements 
for (int i = 0; i < a1.indexOf(commonw); i++) { 
    common.add(a1.get(i)); 
} 
for (int i = a2.indexOf(commonw) + 1; i < a2.size(); i++) { 
    common.add(a2.get(i)); 
} 
System.out.println(common); 
} 
0

Если у вас есть java8 вы можете попробовать

public List<Integer> merge(List<Integer> first, List<Integer> second) { 
    Integer integerToMergeAt = first.stream().filter(i -> second.indexOf(i) >= 0).findFirst().get(); 
    return Stream.concat(first.stream().limit(first.indexOf(integerToMergeAt)), 
      second.stream().skip(second.indexOf(integerToMergeAt))).collect(Collectors.toList()); 
}