Как я могу получить часть пользовательского ввода в Java? - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу создать java программу, которая будет принимать участие пользователя и будет сохранять его для дальнейшего использования. Мой ввод выглядит примерно так:

Mary market 8 theatre 80 end
John books 45 end 

Первое поле обозначает имя человека, а затем следует последовательность расходов с названием причины, по которой они дали деньги. Слово «конец» означает конец ввода для каждого человека.

Мой вопрос состоит в том, как я могу отделить поле имен людей, а также их расходы, чтобы получить вывод среднего значения расходов для каждый из них?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

В случае пользователь вводит данные, как вы указали: Использование метода split() String Основной класс

public class Main {

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);

    //Get Input
    String input = s.nextLine();

    //Split using Whitespace Regex (Or any regex if you want)
    String[] InputArray = input.split(" ");

    //Object to get person info later
    PersonExpense person = new PersonExpense(InputArray[0]);

    //Loop throw the array to get data
    for (int i = 1; i < InputArray.length ; i = i+2) {
        if (InputArray[i].toLowerCase().equals("end"))
            break;
        else{
               person.addExpenses(new Pair<>(InputArray[i],Integer.valueOf(InputArray[i+1])));
        }
    }

}
}

PersonExpense Class

public class PersonExpense {

private String PersonName;

//ArrayList of pairs to save the name and cost of the expense
private ArrayList<Pair <String,Integer> > expenses = new ArrayList <Pair <String,Integer> > ();

public PersonExpense(String personName) {
    PersonName = personName;
}

public void addExpenses(Pair<String, Integer> expense) {
    this.expenses.add(expense);
}

public ArrayList<Pair<String, Integer>> getExpenses() {
    return expenses;
}

public void setExpenses(ArrayList<Pair<String, Integer>> expenses) {
    this.expenses = expenses;
}

public String getPersonName() {
    return PersonName;
}

public void setPersonName(String personName) {
    PersonName = personName;
}
}
0 голосов
/ 15 апреля 2020

Это действительно зависит, если у вас есть строгое согласие, что входные данные всегда будут иметь тот же формат, что и в вашем примере, тогда вы можете просто использовать строку .split(" ") и прочитать все числа для каждой строки.

Пример :

// or any other input, eg: List, BufferedReader, etc
String[] lines = new String[] {
        "Mary market 8 theatre 80 end",
        "John books 45 end"
};
for (String line : lines) {
    String[] raw = line.split(" ");
    String name = raw[0];

    for (int i = 1; i < raw.length; i += 2) {
        if (raw[i].equals("end")) break;
        String expenseName = raw[i];
        int cost = Integer.parseInt(raw[i+1]); 
        ... 
    }
}

Но если нет, тогда, вероятно, лучше использовать RegExp и найти все цифры в каждой строке.

Пример :

// or any other input, eg: List, BufferedReader, etc
String[] lines = new String[] {
        "Mary market 8 theatre 80 end",
        "John books 45 end"
};

Pattern p = Pattern.compile("\\d+");
for (String line : lines) {
    Matcher m = p.matcher(line);
    while(m.find()) {
        int cost = Integer.parseInt(m.group());
        ...
    }
}
...