2016-04-13 3 views
1

Это код, который я реализовал, но я получаю несколько массивов данных в инкрементном порядке, но мне нужны отдельные массивы данных. Как мне подойти к этому? Также нормально ли пытаться поймать внутри блока catch?Как отделить типы данных от текстового файла?

Text File: 
    The 1493 fox 0.4 -6.382 jumped -832722 0 1 9E-21 162 over the dog! 

Например: Двойные значения печатаются каждый раз, когда к ним добавляются данные.

@SuppressWarnings("resource") 
    Scanner s= new Scanner(new File("src/inputs.txt")).useDelimiter("\\s+"); 

    ArrayList<Long> itr= new ArrayList<Long>(); 
    ArrayList<Double> dub = new ArrayList<Double>(); 
    ArrayList<String> str = new ArrayList<String>(); 

    while(s.hasNext()) 
    { 
     String str1=s.next(); 
    try 
     { 
     long b=Long.parseLong(str1); 
     itr.add(b); 
     System.out.println("Integer values are ::"+itr);  
     } 
    catch(NumberFormatException e) 
    { 
     try 
     { 
     double b1=Double.parseDouble(str1); 
     dub.add(b1); 
     System.out.println("Double values are ::"+dub); 
     } 
     catch(NumberFormatException e1) 
     { 
      String b2 = (String) str1; 
      str.add(b2); 
      System.out.println("String Values are"+str); 
     } 
    } 
    } 
}} 

Ожидаемый результат:

Integer values are ::[1493, -832722, 0, 1] 
    Double values are ::[0.4, -6.382, 9.0E-21] 
    String Values are[The, fox, jumped, over, the, dog!] 
+0

@Bohemian Обновлено ..... – Box

+0

Распечатайте Arraylist вне цикла while. – pikrut

+0

Я согласен с @pikrut. Переместите три println за пределы while, в конце алгоритма. Кроме того, почему вы используете Long вместо Integer для первого типа? – RubioRic

ответ

4

Как ответил @RubioRic, переместите операторы SOP вне цикла while, чтобы получить желаемый результат.

Что касается других способов получения типов данных, я считаю, что ваша реализация достаточно хороша и широко используется. Но если вы хотите сделать это по-другому, попробуйте использовать шаблоны регулярных выражений для проверки строки и определения типа данных (не является надежным) ИЛИ используйте API класса сканера, чтобы определить тип данных, как показано ниже.

@SuppressWarnings("resource") 
     Scanner s= new Scanner(new File("src/inputs.txt")).useDelimiter("\\s+"); 

     ArrayList<Long> itr= new ArrayList<Long>(); 
     ArrayList<Double> dub = new ArrayList<Double>(); 
     ArrayList<String> str = new ArrayList<String>(); 

     while(s.hasNext()) 
     { 
      if(s.hasNextLong()){ 
       itr.add(s.nextLong()); 
      } 
      else if(s.hasNextDouble()){ 
       dub.add(s.nextDouble()); 
      } 
      else{ 
       str.add(s.next()); 
      } 
     } 
     s.close(); 
System.out.println("Long values are ::" + itr); 
System.out.println("Double values are ::" + dub);  
System.out.println("String Values are" + str); 
1

Просто переместите печать вне цикла. Извините, у вас нет лучшего решения без использования try-catch.

@SuppressWarnings("resource") 
Scanner s= new Scanner(new File("src/inputs.txt")).useDelimiter("\\s+"); 

ArrayList<Long> itr = new ArrayList<Long>(); 
ArrayList<Double> dub = new ArrayList<Double>(); 
ArrayList<String> str = new ArrayList<String>(); 

while(s.hasNext()) { 
    String str1=s.next(); 

    try { 
     long b=Long.parseLong(str1); 
     itr.add(b); 

    } catch(NumberFormatException e) { 

     try { 
     double b1=Double.parseDouble(str1); 
     dub.add(b1); 
     } catch(NumberFormatException e1) { 
     String b2 = (String) str1; 
     str.add(b2); 
     } 
    } 
} 

System.out.println("Integer values are ::" + itr); 
System.out.println("Double values are ::" + dub);  
System.out.println("String Values are" + str); 
Смежные вопросы