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。
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。
最初の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;
}
}
また、forループを 'なし' l3.addAll(l2.subList(インデックス、l2.sizeを()))を行うと、l1' '超える拡張forループを使用することができます。 – Tunaki
それはマージソートの問題です。マージソートアルゴリズムを適用してみてください。スナップより明快さとコードのためにこれを確認します。そうでなければMerge Sort
これを試してください:あなたはこのような何か行うことができます
List<Integer> list1 = Arrays.asList(array1);
List<Integer> list2 = Arrays.asList(array2);
set.addAll(list1);
set.addAll(list2);
yourResult = set.toArray();
:
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つの値が含まれています。ソートされていない場合はリストをソートする必要があります。
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のいずれかを使用長かったです。それはすでに正しい長さを持ち、データの少なくとも半分は正しい位置に正しい番号になります。
あなたは、あなたが一緒に両方のリストを取得することができますし、かなりはるかに簡単に共通の要素を見つけるのコレクションを使用している場合...この例では
見て:あなたは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);
}
あなたが
を試すことができます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());
}
コレクションは許可されていません。 –
あなたは何をコレクションで意味しますか?違いはありません! @ΦXocę웃いepepeúpaツ – Ebola
これには 'TreeSet'を使うことができます。重複を避け、データをソートした形で保持する – Kaushal28