Объединить два массива в новый и заставить их сортировать их (см. Пример) - PullRequest
0 голосов
/ 31 января 2019

Я пытался выполнить это упражнение почти три часа и до сих пор не понимаю, что я делаю неправильно.Я должен взять два ArrayList с номерами и объединить их в один, но вот подвох, они должны быть отсортированы следующим образом:

Если у массива "A" есть числа [1, 2, 3] и arraylist "B "имеет [9, 8, 7, 6, 5], тогда ArrayList" merge "должен быть [1, 9, 2, 8, 3, 7, 6, 5].

Т.е. он должен чередовать числа из введенных массивов A и B. Если один массив длиннее, он должен просто продолжать заполняться числами (как в этом случае с [7,6,5]. ТакжеМы не знаем длины ни одного из массивов.

Вот одно решение, которое, я думаю, должно работать хорошо, но я не могу заставить его работать. Вся помощь чрезвычайно ценится! *

import java.util.ArrayList;
import java.util.Scanner;

public class test19 {
    public static void main(String[] args) {
        ArrayList<Integer> arrayListA = new ArrayList<>();
        ArrayList<Integer> arrayListB = new ArrayList<>();
        Scanner sc = new Scanner(System.in);


        while(true) {
            System.out.println("Write a number to place in ArrayList A, quit with '-1'");
            int Local = sc.nextInt();
            if(Local > 0) {
                arrayListA.add(Local);
            } else {
                break;
            }

        }
        System.out.println();
        System.out.println();

        while(true) {
            System.out.println("Write a number to place in ArrayList B, quit with '-1'");
            int Local = sc.nextInt();
            if(Local > 0) {
                arrayListB.add(Local);
            } else {
                break;
            }

        }
        System.out.println(merge(arrayListB, arrayListA));

    }

    public static ArrayList<Integer> merge(ArrayList<Integer> a, ArrayList<Integer> b) {
        ArrayList<Integer> merge = new ArrayList<>();

        if(a.size() < b.size()) {
            //here we check which list is the smallest and use that one (so we don't try to add blankspaces from the longer list to the merge list)
            for(int i = 0; i <= a.size(); i++) {
                merge.add(a.get(i));
                merge.add(b.get(i));

            }
            for(int j = a.size(); j <= b.size(); j++) {
                merge.add(b.get(j)); //here we add the leftover numbers to the list

            }

        } else { //this means that list A is bigger than list B
            for(int i = 0; i <= b.size(); i++) {
                merge.add(a.get(i));
                merge.add(b.get(i));
            }
            for(int j = b.size(); j <= a.size(); j++) {
                merge.add(b.get(j));
            }
        }


        return merge;
    }
}

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Я исправил вашу функцию слияния, вам просто нужно использовать оператор <для циклов вместо <= </p>

public static ArrayList<Integer> merge(ArrayList<Integer> a, ArrayList<Integer> b) {
    ArrayList<Integer> merge = new ArrayList<Integer>();

    if(a.size() < b.size()) {
        //here we check which list is the smallest and use that one (so we don't try to add blankspaces from the longer list to the merge list)
        for(int i = 0; i < a.size(); i++) {
            merge.add(a.get(i));
            merge.add(b.get(i));
        }
        for(int j = a.size(); j < b.size(); j++) {
            merge.add(b.get(j)); //here we add the leftover numbers to the list
        }

    } else { //this means that list A is bigger than list B
        for(int i = 0; i < b.size(); i++) {
            merge.add(a.get(i));
            merge.add(b.get(i));
        }
        for(int j = b.size(); j < a.size(); j++) {
            merge.add(a.get(j));
        }
    }
    return merge;
}
0 голосов
/ 31 января 2019

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

import java.util.*;
public class Main {
    public static void main(String[] args) 
    {
        ArrayList<Integer> arrayListA = new ArrayList<Integer>();
        ArrayList<Integer> arrayListB = new ArrayList<Integer>();

        arrayListA.add(1);
        arrayListA.add(2);
        arrayListA.add(3);

        arrayListB.add(9);
        arrayListB.add(8);
        arrayListB.add(7);
        arrayListB.add(6);
        arrayListB.add(5);

        merge(arrayListA, arrayListB);
    }

    public static void merge(ArrayList<Integer> arrayListA, ArrayList<Integer> arrayListB)
    {
        ArrayList<Integer> merged = new ArrayList<Integer>();

        int maxSize = Math.max(arrayListA.size(), arrayListB.size());

        for (int i = 0; i < maxSize; i++)
        {
            if(i < arrayListA.size())
                merged.add(arrayListA.get(i));
            if(i < arrayListB.size())
                merged.add(arrayListB.get(i));
        }

        for(int i = 0; i < merged.size(); i++)
        {
            System.out.println(merged.get(i));
        }
    }
}
0 голосов
/ 31 января 2019

Вот ваш код исправлен.В основном это был случай изменения всех <= на <.Если вы сравните различия, вы сможете увидеть, где вы ошиблись: -

import java.util.ArrayList;
import java.util.Arrays;

public class test19{
    public static void main(String[]args){
        ArrayList<Integer> arrayListA = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
        ArrayList<Integer> arrayListB = new ArrayList<Integer>(Arrays.asList(11, 12, 13, 14, 15, 16, 17));
        System.out.println(merge(arrayListA,arrayListB));
    }

    public static ArrayList<Integer> merge (ArrayList<Integer> a, ArrayList<Integer> b){
        ArrayList<Integer> merge = new ArrayList<Integer>();

        if (a.size()<b.size()) {
            //here we check which list is the smallest and use that one (so we don't try to add blankspaces from the longer list to the merge list)
            for(int i=0; i<a.size(); i++){
                merge.add(a.get(i));
                merge.add(b.get(i));    
            }
            for(int j=a.size(); j<b.size(); j++){
                merge.add(b.get(j)); //here we add the leftover numbers to the list    
            }
        } else { //this means that list A is bigger than list B
            for(int i=0; i<b.size(); i++){
                merge.add(a.get(i));
                merge.add(b.get(i));
            }
            for(int j=b.size(); j<a.size(); j++){
                merge.add(a.get(j));    
            }
        }
        return merge;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...