2016-08-02 3 views
0

2つの配列リストがあります。たとえば:merge 2共通の変数に基づくArrayLists

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

私は以下のような配列リストを持つようにしたい:

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

の2つのがあり配列リスト上の相互変数があると私は配列1 +配列2の第二部での最初の部分を持つようにしたいです新しいarraylist。

+0

コレクションは許可されていません。 –

+0

あなたは何をコレクションで意味しますか?違いはありません! @ΦXocę웃いepepeúpaツ – Ebola

+0

これには 'TreeSet'を使うことができます。重複を避け、データをソートした形で保持する – Kaushal28

答えて

0

最初のListをループして、最初のListの各インデックスの値が2番目のListに存在するかどうかを確認してください。値が存在しない場合は最初のListの値を追加し、存在する場合は残りの値を2番目の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

また、forループを 'なし' l3.addAll(l2.subList(インデックス、l2.sizeを()))を行うと、l1' '超える拡張forループを使用することができます。 – Tunaki

0

それはマージソートの問題です。マージソートアルゴリズムを適用してみてください。スナップより明快さとコードのためにこれを確認します。そうでなければMerge Sort

これを試してください:あなたはこのような何か行うことができます

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

array1の要素をループし、array2内にあるかどうかを毎回確認します。そうでない場合は、それらを追加してarray1のループを続行します。 array2に存在する場合は、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]; 
} 

サイドを助けるべきで、私はちょうどこれに応じて、配列1または配列2のいずれかを使用長かったです。それはすでに正しい長さを持ち、データの少なくとも半分は正しい位置に正しい番号になります。

0

あなたは、あなたが一緒に両方のリストを取得することができますし、かなりはるかに簡単に共通の要素を見つけるのコレクションを使用している場合...この例では

見て:あなたはjava8を持っている場合は

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

あなたが

を試すことができます
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()); 
} 
関連する問題