2014-01-30 3 views
0

Следующее требование: i. Если есть первый, средний и последний, отобразите только первое и последнее имя ii. Если есть первый и последний, то отображаются как первые, так и последние iii. Если есть только первое имя, а затем просто отобразить егоСканер для первого, среднего, последнего

У меня есть следующий код:

String fullName = "first middle last"; 
Scanner nameScanner = new Scanner(fullName); 
nameScanner.findInLine(" "); 
MatchResult result = nameScanner.match(); 
if(result.groupCount() > 2) 
{ 
System.out.println(result.group(1)+ " "+ result.group(3)); 
} 
else 
{ 
System.out.println(fullName); 
} 

Когда я пытаюсь запустить код, я получаю

Exception in thread "main" java.lang.IllegalStateException: No match result available 
at java.util.Scanner.match(Unknown Source) 
at com.assignment.RunAssignmentApp.main(RunAssignmentApp.java:48) 

Что я делаю неправильно ?

+0

Я думаю, что ваш findInLine аргумент нуждается в некоторых захвата групп (пар скобок). – Gus

+0

Когда я попробовал это, у меня не получилось исключение (но оно просто напечатало «first middle last»). – ajb

+0

'MatchResult' будет ссылаться на то, что вы искали, т. Е. На одно место. Группы - это подстроки всей согласованной строки. Но вся согласованная строка - это просто '' ''. – ajb

ответ

1

String имеет встроенный split().

String fullName = "first middle last"; 
String[] names = fullName.split(" "); 

switch(names.length) { 
    case 3: // The string had three tokens. Print the first and last one. 
     System.out.println(names[0] + names[2]); 
     break; 
    case 2: // The string had two tokens. Print both. 
     System.out.println(names[0] + names[1]); 
     break; 
    case 1: // The string had one tokens. Print it. 
     System.out.println(names[0]); 
     break; 
    default: // The string had less than one or greater than 3 tokens. 
     System.out.println("You either have no name or a very long name!"); 
} 
+1

split() отсутствует регулярное выражение :) – AWT

+0

@AWT Oh noooooooo. Я мог бы поклясться, что split() работал по пробелам по умолчанию. Исправленный! – Rainbolt

1

Сканер не работает таким образом. То, как вы пишете это, вы бы лучше расколоть вход в строковые массивы на основе пространств:

public static void nameScanner() { 
    String fullName = "first middle last"; 
    String[] names = fullName.split(" "); // split the string at the spaces 
    if (names.length > 2) { 
     System.out.println(names[0] + " " + names[2]); // arrays start at index 0, so names[0] is first name 
    } else { 
     System.out.println(fullName); 
    } 
} 

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

1

Попробуйте

nameScanner.findInLine("(\\w+) (\\w+) (\\w+)"); 
+0

Я бы порекомендовал поставить '+' после каждого из пространств. – ajb

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