Как разбить строку, указанную при входе пользователя в Java? - PullRequest
0 голосов
/ 16 сентября 2018

Как разделить type на car и color, которые пользователь предоставляет в качестве ввода.

Формат ввода:

<Type>#<Color>

Вывод покажет, сколько типов автомобилей имеет тот же color

пример ввода:

how many cars : 10
sedan#red
truck#yellow
van#white
suv#black
sedan#black
roadster#red
suv#gray
coupe#gray
minivan#white
truck#red

вывод должен быть отсортирован по алфавиту

black 2
gray 2
red 3
white 2
yellow 1

Попробовал пример кода, все еще не выполнено, но где-то вроде как разбить массив T^T

Class1 :

 public class Class1 {

    private String type ;
    private String color;
    private String format;

    public Class1() {
        this.type = "";
        this.color = "";
        this.format = "";
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    public void split () {  
        String part[] = format.split("#");
        setType(part[0]);
        setColor(part[1]); // i don't know if this will work or not.. 
    } 
}

Class2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Class2 {


    public static void main(String[] args) throws NumberFormatException, IOException {
        // TODO Auto-generated method stub
        int n ;
        String format ;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        n = Integer.parseInt(br.readLine());

        Class1 [] dataArray = new Class1[n] ;
        Class1 data = new Class1();

        for(int a = 0 ; a <= dataArray.length ; a++) {
            dataArray[a] = data;
            data.setFormat(br.readLine());

            data.split();
            data.getType();
            data.getColor();
        }
    }
}

Кодирование все еще не завершено и все еще не знает, как разбить массив. Пожалуйста, помогите мне решить эту проблему!

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Инициализируйте новый объект Class1 data = new Class1(); внутри цикла for, а не вне его, иначе он будет переопределен при каждом запуске цикла.

Также итерируйте по a < dataArray.length вместо a <= dataArray.length.

Я добавил groupingBy, чтобы получить счет, сгруппированный по названию цвета. Затем я отсортировал entrySet полученного Map<String, Integer> и распечатал содержимое.

Я достиг ожидаемого результата, не слишком изменив ваш код.

public static void main(String[] args){
    try{
        int numberOfCars;
        String format ;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        numberOfCars = Integer.parseInt(br.readLine());
        Class1 [] dataArray = new Class1[numberOfCars] ;

        for(int a = 0 ; a < dataArray.length ; a++) {
            //Initializing new instance everytime
            Class1 data = new Class1();
            data.setFormat(br.readLine());
            data.split();
            dataArray[a] = data;
        }
        //Creating a Stream of Class1 objects
        Arrays.stream(dataArray)
              .collect(Collectors.groupingBy(car -> car.getColor(), Collectors.counting()))
              .entrySet() //Getting entries from Map
              .stream() //sorting after the Map is created to preserve the sorted order
              .sorted(Comparator.comparing(entry -> entry.getKey())) //Sorting by key, that is the Color property of Class1
              .forEach((entry) -> System.out.println(entry.getKey() + " "+ entry.getValue()));
        }catch (NumberFormatException | IOException | ArrayIndexOutOfBoundsException e) {
              System.out.println("Error occurred try again");
              e.printStackTrace();
        }
}
0 голосов
/ 16 сентября 2018

Измените ваш for цикл из этого:

   for(int a = 0 ; a <= dataArray.length ; a++) {
        dataArray[a] = data;
        data.setFormat(br.readLine());

        data.split();
        data.getType();
        data.getColor();
    }

к этому:

    for(int a = 0 ; a < dataArray.length ; a++) {
        Class1 data = new Class1();
        dataArray[a] = data;
        data.setFormat(br.readLine());

        data.split();
        data.getType();
        data.getColor();
    }

Два важных изменения:

  1. Вы должны выполнять цикл только тогда, когда a < dataArray.length, в противном случае вы получите ArrayIndexOutOfBoundsException когда a == dataArray.length.

  2. Вам нужно создавать новый экземпляр Class1 каждый раз, когда вы читаете в новую строку и сохраните в позиции a вашего dataArray

Кроме этого это выглядит хорошо. Очевидно, в вашем дизайне есть некоторые придирки - может быть, setFormat должен звонить split, а не требовать отдельного звонка? - но теперь вы должны иметь возможность перебирать dataArray и считать цвета, вероятно, используя Map<String, Integer>

...