1

このメソッドは、2 つのリストを受け取り、それらを新しいリストに入れ、それを返すことになっています。

たとえば、(1, 2, 3, 4, 5) の最初のリストと (6, 7, 8, 9, 10, 11, 12) の 2 番目のリストの場合、alternate(list1, list2) の呼び出しは次のようになります。 (1, 6, 2, 7, 3, 8, 4, 9, 5, 10, 11, 12) を含むリストを返します。

動作していますが、混乱しているように見えます。物事を単純化する方法はありますか?

public static List<Integer> alternate(List<Integer> list1, List<Integer> list2) {
List<Integer> template = new LinkedList<Integer>();

int i = 0; // counts where list1 goes into new list
int j = 1; // counts where list2 goes into new list

    if (list1.size() != 0) { // If first list isn't empty
    for (Integer elem1: list1) { // copies all of first list into new list.
        template.add(i, elem1);
        i++;
    }

    for(Integer elem2: list2) { // copies every element into new list into every othe element
        if (j < template.size()) { // if j is not at point where first list ends.
            template.add(j, elem2);
            j+=2;
            } else {
            template.add(j, elem2); // if j is at point where first list ends.
                j++;
            }
        }
    } else {
        for (Integer elem1: list2) { // If first list is empty
            template.add(i, elem1);
            i++;
        }
    }

    return template;
}
4

3 に答える 3

3

これは、2 つのIteratorを並行して実行することで実行できます。メソッドを使用List#iterator()して、リストのイテレータを取得します。

public static List<Integer> alternate(List<Integer> list1, List<Integer> list2) {
    Iterator<Integer> iter1 = list1.iterator();
    Iterator<Integer> iter2 = list2.iterator();
    List<Integer> merged = new ArrayList<>();

    // Iterate while there is element in any of the list
    while (iter1.hasNext() || iter2.hasNext()) {
        if (iter1.hasNext()) {
            // This will stop adding once the iter1 has exhausted
            merged.add(iter1.next());
        }
        if (iter2.hasNext()) {
            // This will stop adding once the iter2 has exhausted
            merged.add(iter2.next());
        }
    }

    return merged;
}

public static void main(String[] args) {
    List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> list2 = Arrays.asList(6, 7, 8, 9, 10, 11, 12);

    System.out.println(alternate(list1, list2));
}

あらゆる種類のリストで機能するジェネリック メソッドを使用することもできます。

public static <T> List<T> alternate(List<T> list1, List<T> list2) {
    Iterator<T> iter1 = list1.iterator();
    Iterator<T> iter2 = list2.iterator();
    List<T> merged = new ArrayList<>();

    while (iter1.hasNext() || iter2.hasNext()) {
        if (iter1.hasNext()) {
            merged.add(iter1.next());
        }
        if (iter2.hasNext()) {
            merged.add(iter2.next());
        }
    }

    return merged;
}

List<String>これにより、s 、List<Double>s などをマージできます。

于 2013-10-11T18:19:21.267 に答える
2

当然。Rohit は反復子を使用したソリューションを示しています。これは手動反復を使用したソリューションです。

public List<Integer> alternate(List<Integer> list1, List<Integer> list2) {
  List<Integer> list3 = new ArrayList<Integer>();

  List<Integer> shortest, longest;
  if (list1.size() < list2.size()) {
    shortest = list1;
    longest = list2;
  } else {
    shortest = list2;
    longest = list1;
  }

  // do paired insertion for as many elements as are 'shared'
  int i, last;
  for(i=0, last = shortest.size(); i < last; i++) {
    list3.add(list1.get(i));
    list3.add(list2.get(i));
  }

  // them simply pad the list with the runoff only found in the longest list
  last = longest.size();
  for(; i<last; i++) {
    list3.add(longest.get(i));
  }

  return list3;
}
于 2013-10-11T18:19:14.910 に答える
1

代わりに反復子を使用してみて、両方のリストから同時に要素を追加してください。

public static List<Integer> alternate(List<Integer> list1, List<Integer> list2) {
    List<Integer> template = new LinkedList<>();

    // Add elements alternately from each of the input lists.
    Iterator<Integer> it1 = list1.iterator();
    Iterator<Integer> it2 = list2.iterator();

    while (it1.hasNext() && it2.hasNext()) {
        template.add(it1.next());
        template.add(it2.next());
    }

    // Add the extra elements from whichever list has not reached the end.
    while (it1.hasNext()) {
        template.add(it1.next());
    }
    while (it2.hasNext()) {
        template.add(it2.next());
    }

    return template;
}
于 2013-10-11T18:23:23.417 に答える