2015-06-12 1 views
0

Я пытался решить эту проблему в течение нескольких дней, и мне удалось решить только половину ее, следующую часть, которая беспокоя меня, кажется, немного сложнее, и мне было интересно, можно ли указать в правильном направлении, как я могу справиться с этим.Поиск общего дохода 3 повторных имен (людей) в текстовом файле

У меня есть 3 имени, которые повторяются в текстовом файле в каждой строке (в случайном порядке), и каждое из этих имен содержит 2 числа рядом с ними, которые представляют цену и количество. (Как показано ниже)

Jack 8 2 
Joe 4 2 
Mike 14 5 
Jack 3 3 
Jack 9 1 
Jack 2 2 
Mike 20 6 
Sofia 11 3 
Jack 13 6 
Mike 8 5 
Joe 8 4 
Sofia 8 1 
Sofia 1 6 
Sofia 9 4 
  • мне удалось умножить эти 2 номера на каждой линии моего ответа рядом с каждым именем. (Первая проблема решена)

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

Я задумался, должен ли я использовать переключатель, в то время, если, иначе петли и/или массивы, но я не могу получить мою голову вокруг, как достичь моего желаемого результата. Я начал сомневаться в том, прошел ли мой текущий код (показано ниже) в неправильном направлении для получения общего дохода от трех имен.

String name; 
 
int leftNum, rightNum; 
 

 
//Scan the text file 
 
Scanner scan = new Scanner(Explore.class.getResourceAsStream("pay.txt")); 
 

 
while (scan.hasNext()) { //finds next line 
 
    name = scan.next(); //find the name on the line 
 
    leftNum = scan.nextInt(); //get price 
 
    rightNum = scan.nextInt(); //get quantity 
 
    int ans = leftNum * rightNum; //Multiply Price and Quanity 
 
    System.out.println(name + " : " + ans); 
 
} 
 

 
// if name is Jack, 
 
// get that number next to his name 
 
// and all the numbers next to name Jack are added together 
 
// get total of the numbers added together for Jack 
 

 
// if else name is Mike, 
 
// Do the same steps as above for Jack and find total 
 

 
// if else name is Joe, 
 
// same as above and find total

Мои последние мысли обдумывая использование если, если еще цикл, но я не могу показаться, чтобы придумать способ, чтобы получить Java, чтобы прочитать имя и получить его номер к нему. Затем найдите все строки с одинаковым именем для своего номера, и, наконец, добавьте все числа рядом с этим именем. Повторите три имени.

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

+0

Я не могу запустить фрагмент. Что такое 'Explore.class'? Исправляя 'java.util.Scanner' с' File' ваш код работает. – chris

+0

Explore.class - это название моего проекта здесь. Я использую Explore для проверки различных вещей, прежде чем использовать код в своей основной программе. – Masch

ответ

2

Как насчет Map<String, Long>:

Map<String, Long> nameSumMap = new HashMap<>(3); 
while (scan.hasNext()) {  //finds next line 
    name = scan.next();  //find the name on the line 
    leftNum = scan.nextInt(); //get price 
    rightNum = scan.nextInt(); //get quantity 

    Long sum = nameSumMap.get(name); 
    if(sum == null) {   // first time we see "name" 
     nameSumMap.put(name, Long.valueOf(leftNum + rightNum)); 
    } else { 
     nameSumMap.put(name, sum + leftNum + rightNum); 
    } 
} 

В конце концов, карта содержит сумму, связанную с каждым именем.

+0

Я попытался сделать это, но по какой-то причине на строке ниже «if», где он имеет «leftNum + rightNum», дает мне ошибку. В частности, говорится, что «int не может быть преобразован в Long»? – Masch

+0

@Masch Я отредактировал свой ответ, чтобы добавить '' Long.valueOf'', чтобы преобразовать его в '' Long'' –

+0

. Вот и все получилось, спасибо, что помогли мне снова здесь. – Masch

0

Вы можете использовать карту с ключевой строкой (имя) и значением Double (потраченные деньги).

Всякий раз, когда вы читаете строку:

  1. вы проверить, является ли имя на карте с containsKey
  2. , если он не существует, put текущая сумма на карте
  3. В противном случае, если он существует, вы получаете текущее значение с get, вы добавляете текущую сумму, и вы возвращаетесь обратно на карту. put.
1

Вы можете взглянуть на HashMap.

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

Более OOP способ сделать это, может быть следующее:

  • Создайте объект со следующими свойствами: Name, Price, Quantity.
  • Когда вы проходите через свой файл, создайте объект на строку, обозначая, что купили каждый.
  • После того, как объект создан, добавьте его в список.

Это позволит вам пройти через объекты и выполнить любые расчеты, которые могут вам понадобиться.

Смежные вопросы