2016-11-21 3 views
1

Я искал ответ, но мне не повезло найти тот, который может мне помочь (кто-то может знать, где указать мне).Java: разделите строку на отдельные строки и целочисленные переменные

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

Код:

import java.util.Scanner; 

public class StringInputStream { 
    public static void main (String [] args) { 
     Scanner inSS = null; 
     String userInput = "Jan 12 1992"; 
     inSS = new Scanner(userInput); 

     String userMonth = ""; 
     int userDate = 0; 
     int userYear = 0; 

     // Can modify anything below here 
     String[] temp = userInput.split(" ", 2); // "1" means stop splitting after one space 
     userMonth = temp[0]; 
     userDate = temp[1]; 
     userYear = temp[2]; 
     // Can modify anything above here 

     System.out.println("Month: " + userMonth); 
     System.out.println("Date: " + userDate); 
     System.out.println("Year: " + userYear); 

     return; 
    } 
} 

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

Month: Jan 
Date: 12 
Year: 1992 
+2

см https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String) –

+0

простой способ будет спросить пользователь вводит день, месяц и год отдельно (3 звонка на сканер) и проверяет каждый отдельно. – alfasin

ответ

4

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

userMonth = inSS.next(); 
userDate = inSS.nextInt(); 
userYear = inSS.nextInt(); 

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

String userInput = "Jan 12 1992"; 
String[] tokens = userInput.split("\\s+"); // <-- split on one or more spaces 
String userMonth = tokens[0]; 
int userDate = Integer.parseInt(tokens[1]); 
int userYear = Integer.parseInt(tokens[2]); 
+0

Итак, используя следующий метод, вы пропустите и пропустите любое значение, которое я объявляю? – Aramza

+0

@Aramza Я не уверен, что вы спрашиваете, у вас есть 'inSS = новый сканер (userInput);' что означает, что ваш 'Scanner' читает вашу предопределенную' String'. 'Next()' читает 'String' (Jan),' nextInt' читает 12, а третий 'nextInt' читает 1992. Во второй версии я пропускаю« Scanner »и использую' String.split'. –

-1

Похоже, что вы имеете дело с датой строк, лучше использовать конкретную библиотеку.

Java 8

import java.time.format.DateTimeFormatter; 
import java.time.temporal.*; 

TemporalAccessor d = DateTimeFormatter.ofPattern("MMM DD yyyy").parse("Jan 12 1992") 
d.get(ChronoField.YEAR); // 1992 
d.get(ChronoField.MONTH_OF_YEAR); // 1 
d.get(ChronoField.DAY_OF_MONTH); // 12 

Перед Java 8 (java.text.SimpleDateFormat)

Date d = new SimpleDateFormat("MMM DD yyyy").parse("Jan 12 1992"); 
Calendar c = Calendar.getInstance(); 
c.setTime(d); 
c.get(Calendar.YEAR); // 1992 
c.get(Calendar.MONTH); // 0 - yeah, it starts from 0, embarrassingly 
c.get(Calendar.DAY_OF_MONTH); // 12 

Или используйте JodaTime

DateTimeFormat.forPattern("MMM DD yyyy").parseDateTime("Jan 12 1992"); 
+0

этот ответ применяется только в том случае, если установлена ​​версия java [email protected] –

+0

Месяц года по-прежнему требуется быть строкой –

+0

OP имеет дело с датами, давайте не будем усложнять проблему и ** не ** используем нужную библиотеку времени. –

0

Я не хочу использовать кувалдой, чтобы взломать гайку :-), но в зависимости от гибкости, которая вам нужна в вашем приложении в отношении предоставленного ввода, вы можете использовать синтаксический анализатор для своей проблемы. Если вы возьмете грамматику ниже и поместите ее в ANTLR, вы можете проанализировать входную строку и извлечь из нее семантические элементы. Вы даже можете обрабатывать различные входные перестановки, такие как Jan 1999 12, 1999 Mar 12 и так далее.

grammar SimpleMixed; 
fragment A:('a'|'A'); 
fragment B:('b'|'B'); 
fragment C:('c'|'C'); 
fragment D:('d'|'D'); 
fragment E:('e'|'E'); 
fragment F:('f'|'F'); 
fragment G:('g'|'G'); 
fragment H:('h'|'H'); 
fragment I:('i'|'I'); 
fragment J:('j'|'J'); 
fragment K:('k'|'K'); 
fragment L:('l'|'L'); 
fragment M:('m'|'M'); 
fragment N:('n'|'N'); 
fragment O:('o'|'O'); 
fragment P:('p'|'P'); 
fragment Q:('q'|'Q'); 
fragment R:('r'|'R'); 
fragment S:('s'|'S'); 
fragment T:('t'|'T'); 
fragment U:('u'|'U'); 
fragment V:('v'|'V'); 
fragment W:('w'|'W'); 
fragment X:('x'|'X'); 
fragment Y:('y'|'Y'); 
fragment Z:('z'|'Z'); 

s: userinput EOF; 
userinput: month date year 
    | month year date 
    | year month date 
    | year date month 
    | date year month 
    | date month year; 

month: Month; 
date: Date; 
year: Year; 
Month: J A N | F E B | M A R | A P R | M A Y | J U N | J U L | A U G | S E P  | 
O C T | N O V | D E C; 

Date: [1-9][0-2]?; 

Year: [1-9][0-9][0-9][0-9]; 


WS : [ \t\r\n]+ -> skip; 

Давайте предположим, что пользователь обеспечивает ввод jan 1999 12. После разбора его парсером, созданным из Antlr из вышеприведенной грамматики, вы получите дерево разбора, из которого вы можете легко извлечь семантические элементы, на основе которых вы можете вывести тип данных и создать соответствующие объекты (например, int для года и даты , и String для месяца).

enter image description here

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