Strange Order

Здравейте, не мога да разбера къде ми е грешката.Гърми ми един от тестовете.

https://pastebin.com/s5ts0i0h това е кода.
Ако някой знае нека сподели :slight_smile:

Здравей :slight_smile:
Грешката си е доста говоряща: StringIndexOutOfBoundsException
И ето тук се опитваш да достъпиш above.length()-1:
System.out.print(above.substring(0, above.length()-1));

И резултатът изглежда така:
Your output (clipped)

-1,-123,-123,-1,-12,

Помисли, какво би се случило, ако няма елементи които са над 0 :slight_smile:

Успех,
Диди

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

public class Main {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String lineInput = scanner.nextLine();
String[] lineString = lineInput.split(",");
Integer[] line = new Integer[lineString.length];
ArrayList<Integer> negatives = new ArrayList<>();
ArrayList<Integer> positives = new ArrayList<>();
ArrayList<Integer> nulls = new ArrayList<>();

for (int i = 0; i < line.length; i++) {
line[i] = Integer.parseInt(lineString[i]);
}
for (int i = 0; i < line.length; i++) {
if (line[i] > 0) {
positives.add(line[i]);
} else if (line[i] < 0) {
negatives.add(line[i]);
} else {
nulls.add(line[i]);
}
}
}
}

Здравейте,
Логигата на задачата ми е вярно, но дотам…
Нямам никаква идея как да конкатенирам три arraylist-a.
С някакви опити на посоки го докарах до 60/100.
Моля за съдействие :slight_smile:

Здравей, Юлиян,

Тъй като в горния код не си посочил как извеждаш резултата, един възможен начин е да използваш списък, да кажем output, от тип ArrayList<String>, към който последователно да добавиш всички елементи на списъците positives, negatives и nulls в подходящ ред, след което да съединиш елементите на output в един стринг чрез String.join(",", output). За преобрaзуване от Integer в String могат да се използват конструкции от вида на positives.get(i).toString().

За да се избегне двукратното преобразуване на типове, списъците positives, negatives и nulls могат да пазят директно стрингове, а временно преобразуването към int да се извършва само при разпределянето на елементите на входния масив от стрингове към тези три списъка. При този подход, за съединяване на трите списъка в един, вместо цикли може да се използва методът addAll(), напр. output.addAll(negatives). Друг вариант е крайният резултат, output, да бъде променлива от тип StringBuilder, а долепянето на елементите да става с конструкции от вида output.append(positives.get(i).toString()).

EDIT: Разбира се, тъй като условието на задачата изисква да се изведе (на екрана) резултатът от пренареждането на входните данни, а не да се образуват каквито и да било списъци, елементите на списъците positives, negatives и nulls могат просто да се отпечатат, разделени със запетайки. Но тогава трябва да се вземе предвид, че някои от списъците могат да бъдат празни.

Тъй като за размерите на помощните списъци е известна горна граница (броят на подадените като вход числа), задачата може да се реши само с масиви. Също така, вместо масив/списък nulls може да се пази само броят на нулите във входния масив.

Надявам се, че този коментар не съдържа прекалено много излишна информация.
Поздрави,
Иван

1 Like

Здравей, Иван,
А как на практика мога да добавя елементите на списъците positives, negatives и nulls към output?

Поздрави,
Юлиян

Ако работиш с първия вариант, при който елементите на списъците са от тип Integer, например така:

for (Integer p : positives) { 
    output.add(p.toString()); 
}

и по същия начин за останалите два списъка.

Друг, малко по-дълъг за писане, начин е следният:

for (int i = 0; i < positives.size(); i++) { 
    output.add(positives.get(i).toString()); 
}
1 Like

Мноооого благодаря :slight_smile: