Я пытался решить это упражнение уже почти три часа и до сих пор не понимаю, что я делаю неправильно. Я должен взять два ArrayList с числами и объединить их в один, но вот в чем загвоздка, они должны быть отсортированы следующим образом:
Если массив "A" имеет числа [1, 2, 3], а массив "B" имеет [9, 8, 7, 6, 5], то "слияние" ArrayList должно быть [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;
}
}
Возможный дубликат Лучший способ объединить и удалить дубликаты из нескольких списков в Java




Вот ваш код исправлен. В основном это был случай замены всех <= на только <. Если вы сравните различия, вы сможете увидеть, где вы ошиблись: -
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;
}
}
Я исправил вашу функцию слияния, вам просто нужно использовать оператор < в циклах вместо <=
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;
}
Другие уже ответили на это, просто предоставив альтернативную реализацию, которую может быть легче читать.
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));
}
}
}
j<=a.size()должен бытьj<a.size()(и другие подобные случаи). На самом деле, в вашем коде немного не так; в основном вы перепутали a и b в нескольких местах.