Помощь сканера - Java - PullRequest
       32

Помощь сканера - Java

3 голосов
/ 19 февраля 2012

Я искал небольшую помощь, поскольку я в своем уме, чтобы достигнуть этого.

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

Пример файла:

California Tim John $50,000 $78,890 $30,000
North Dakota John Jones $30,000 $40,000 $56,000
Washington Susan K. Bones $30,000 $40,000 $56,000

Как видите, имя может содержать более трех слов (включая среднюю букву)

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

Пример вывода:

Сьюзан К. Бонс $ 126,000

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

Вот мой код полной компенсации.

Также обратите внимание: я должен использовать сканерна этом.

Scanner in = new Scanner(file);
            in.nextLine();      
                do {
                    double totalCompensation = 0.0; 
                    String readLine = in.nextLine();
                    readLine = readLine.replaceAll(",", "").replace("$", " ");
                    String presidentName = "";
                    Scanner readNumber = new Scanner(readLine);
                    while(readNumber.hasNext()) {                               
                        if (readNumber.hasNextDouble()) 
                            totalCompensation += readNumber.nextDouble();
                        else {
                            readNumber.next();
                        }
                    }

Еще одно замечание: не волнуйтесь, у меня есть время (in.hasNextLine ()), чтобы закрыть цикл do, позже в моем коде.Я просто не хочу вставлять все это целиком.

Любые намеки приветствуются!Спасибо!

Ответы [ 4 ]

2 голосов
/ 19 февраля 2012

Если вы заранее ЗНАЕТЕ, что будете видеть только названия штатов США, вы могли бы, чтобы ваш код сначала искал название штатов.Поскольку вы знаете, какая часть является названием штата, а какая - компенсацией, все, что осталось, должно быть именем губернатора.Всего 50 штатов, так что это не сложно.

Если это более общий термин и может быть городом / страной / чем угодно, а не только США, то нет способа отличить без лучшего символа-разделителя.(или кавычки, чтобы определить «имя штата» и «имя губернатора».

РЕДАКТИРОВАТЬ: Вы упоминаете, что есть дополнительное требование, чтобы имя «лидера» было в форме «Имя Фамилия» «Имя М. «Фамилия» или «Ф. Имя миддлна». ТЕПЕРЬ у вас есть достаточно, чтобы решить ответ.

Когда вы вытаскиваете строки со сканером, помещаете их в список (или, если вы узнали этот тип данных, стекявляется более подходящим.) Перейдите список в обратном направлении. Если 2-й элемент является инициалом, вы знаете, что имя состоит из трех частей. Если 3-й элемент является инициалом, вы знаете, что имя состоит из трех частей. Если ни один из них не является инициалом, вызнаю, что имя состоит из двух частей. Что бы не было именем лидера, это имя места.

1 голос
/ 19 февраля 2012

Мой предыдущий ответ совершенно не использовал сканер, что было заявленным требованием. Как и прежде, я использую префикс «New», «North» и т. Д. Для обозначения двухсловных имен состояний.

static String[] TWO_WORD_STATE_PREFIXES = new String[] {"New", "Rhode", "North", "West", "South"};

public static void scanLine(String line) {
    Scanner s = new Scanner(line);
    String stateName = s.next();

    for (String prefix : TWO_WORD_STATE_PREFIXES)
        if (stateName.equals(prefix))
            stateName += " " + s.next();

    String governorName = "";

    String nextToken;
    while (!(nextToken = s.next()).startsWith("$"))
        governorName += nextToken + " ";

    governorName = governorName.trim();

    int compensation = 0;
    while (s.hasNext())
        compensation += Integer.parseInt(s.next().replaceAll("[\\$, ]", ""));

    System.out.println(stateName + " - " + governorName + " : " + compensation);
}

public static void main(String[] args) {
    scanLine("California Tim John $50,000 $78,890 $30,000");
    scanLine("Virginia Some Guy $55,000 $71,890 $30,000");
    scanLine("South Carolina Bill F. Gates $91,000 $1,200");
    scanLine("Vermont Joan Smith $60,000 $78,890 $30,000");
    scanLine("North Dakota Tim John $50,000 $78,890 $30,000");
}
1 голос
/ 19 февраля 2012

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

List<String> stateNames={"Alabama","Alaska","Texas"};
0 голосов
/ 19 февраля 2012

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

Для начала вам понадобится список городов и штатов. Вот список городов (должно быть довольно легко разобрать фактические названия городов) http://www.census.gov/tiger/tms/gazetteer/places2k.txt, и я уверен, что где-то можно найти список штатов.

Если у вас есть это, вот простая стратегия для эффективного решения:

  • поместите список городов и штатов в хеш-таблицу
  • разбить входную строку (например, "Califonia John Doe $ 213 $ 1232") на пробелы
  • для каждого префикса этого списка, проверьте, есть ли соответствующая строка в хеш-таблице - если это так, то предположите, что это штат / город и проанализируйте остальную часть ввода соответствующим образом.

Редактировать: не важно - вы добавили в вопрос некоторую информацию, которая значительно облегчает его решение. Это больше не эффективная проблема поиска строк - теперь это простая головоломка, которая поможет вам попрактиковаться в зацикливании на Java. Смотри ответ Кейна.

Интересно, как радикально немного информации может изменить масштаб проблемы:)

...