2015-10-02 6 views
0

Я пытаюсь использовать StringTokenizer для установки запятой в качестве разделителя с строками из файла, каждый из которых состоит из zipcode и city (ex 01221, Washington, DC), но я не хочу, чтобы вторая запятая быть разделителем, поскольку он является частью названия города. У меня есть 2 класса, в которых я читаю в почтовом индексе и имени города, но я не уверен, как правильно использовать токенизатор для установки почтового индекса и города. Я хочу вернуть 1 массив каждого почтового индекса и города из каждого класса, поэтому я не хочу объединять их в один класс. Я также не уверен, должен ли я помещать токенизатор в свой основной метод или нет.Использование StringTokenizer

public static String[] getZipCodes (File zips, Scanner hi, int d) 
{ 
    //creating array of zip codes with the length of the number of lines 
    String[] zipCodes=new String[d]; 
    //Loops through each zip code to fill the array 
    for (int i=0; i<d; i++) 
    { 
     zipCodes[i]=hi.next(); 
     System.out.println(zipCodes[i]); 
    } 
    return zipCodes; 
} 

public static String[] getCities (File zips, Scanner hi, int d) 
{ 
    //creating array of cities 
    String[] cities=new String[d]; 
    //fills array with city names, parallel to its zip code 
    for (int i=0; i<d; i++) 
    { 
     hi.next(); 
     cities[i]=hi.next(); 
     hi.nextLine(); 
    } 
    return cities; 
} 

Вот основной метод:

public static void main(String[] args) throws IOException { 
    File zips=new File("ZipCodesCity.txt"); 
    //Scanner to count number of lines in file 
    Scanner in=new Scanner(zips); 

    //Counting number of zip codes 
    int codenum=0; 
    while (in.hasNextLine()) 
    { 
     codenum++; 
    } 

    //making a second scanner to read in the zip codes 
    Scanner hi= new Scanner(zips); 

    //initializing array of zip codes 
    String[]zipCodes=getZipCodes(zips, hi, codenum); 

    //Tokenizer 
    StringTokenizer wrd=new StringTokenizer(hi.nextLine(), ","); 
} 
+0

Я добавил тесную скобу, которая, казалось, отсутствовала; если это было неправильно, переименуйте. Если это было правильно, отметьте этот комментарий устаревшим. –

+1

Если вам нужно разбить строку на две части во всех случаях, рассмотрите возможность использования String.indexOf() и String.substring(). Tokenizer полезен, когда количество подстроки не является предикативным (кстати, вы можете использовать String.split() для выполнения той же операции). –

+0

Я не уверен, как я мог бы взять indexOf (0,4) для каждой строки, так как я должен был бы сказать in.next() и indexOf –

ответ

1

Обходной решение вашей проблемы будет использовать регулярное выражение с StringTokenizer. Вы только пытаетесь разбить первую запятую, так как вторая запятая является частью названия города. Удобно, первая запятая всегда приходит после номера, так как почтовый индекс всегда является номером, а вторая запятая никогда не приходит после номера, потому что ни одно название города не содержит цифр. Таким образом, ваш разделитель - это любое выражение, в котором есть число, за которым следует запятая. Вы можете ссылаться на this article, чтобы увидеть пример использования regex с stringtokenizer.

EDIT Более просто вы могли бы просто взять подстроку, состоящую из 5 первых символов, так как каждый почтовый индекс имеет длину 5, а затем остальная часть строки является город и государство. Этот подход намного проще

+1

. Просто вы могли бы просто взять подстроку, состоящую из первых 5 символов, поскольку каждый zip-код имеет длину 5, а затем остальная часть строки является городом и состоянием. Этот подход намного проще – swam92