5

У меня есть небольшая проблема с одной программой JAVA. Я пытаюсь выполнить алгоритм InsertionSort, но, похоже, проблема в преобразовании String, которую программа получает через stdin. Похоже, что программа работает с несколькими номерами, но он не работает с этими числами: https://dl.dropboxusercontent.com/u/57540732/numbers.txtNumberFormatException для строки, которая выглядит как номер

Это мой алгоритм:

public class Sort { 

    private static ArrayList<String> insertionSort(ArrayList<String> arr) { 
     for (int i = 1; i < arr.size(); i++) { 
      int valueToSort = Integer.parseInt(arr.get(i).trim()); 
      int j = i; 
      while (j > 0 && Integer.parseInt(arr.get(j - 1).trim()) > valueToSort) { 
       arr.set(j, arr.get(j-1)); 
       j--; 
      } 
      arr.set(j, Integer.toString(valueToSort)); 
     } 
     return arr; 
    } 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     ArrayList<String> al; 
     String inputNumbers = sc.nextLine(); 
     String[] xs = inputNumbers.split(" "); 
     al = new ArrayList<String>(Arrays.asList(xs)); 
     al = insertionSort(al); 
     for (int i = 0; i<al.size(); i++) { 
      System.out.print(al.get(i) + " "); 
     } 
    } 
} 

Он работает с несколькими номерами, но не с этим файлы I предоставлено вам. Я получаю следующее исключение:

Exception in thread "main" java.lang.NumberFormatException: For input string: "4531" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580) 
    at java.lang.Integer.parseInt(Integer.java:615) 
    at Sort.insertionSort(Sort.java:10) 
    at Sort.main(Sort.java:25) 

Я не знаю, почему я получаю это исключение, потому что строка ввода - это число (4531). Какие-либо предложения? я не могу скопировать и вставить аль чисел из файла в терминале, поэтому я использую эту команду:

javac Sort.java 
java Sort < numbers.txt 
+0

я думаю, что проблема с nextLIne() –

+0

класс Scanner имеет метод nextInt() и hasNextInt(). Может быть, вы должны попробовать использовать их вместо того, чтобы разбирать строку с целым числом. – abekenza

ответ

4

Вы невидимый символ в «4531».

Как это исправил:

После:

al = new ArrayList<String>(Arrays.asList(xs)); 

Запись:

List a2 = new ArrayList<String>(a1.size()); 
    for(String s: a1) { 
     a2.add(s.replaceAll("[^\\d.]", ""));  
    } 
    a1 = a2; 

Как нашел этот символ:

После:

al = new ArrayList<String>(Arrays.asList(xs)); 

Запись:

List a2 = new ArrayList<String>(a1.size()); 
    int line = 0; 
    for(String s: a1) { 
     int i = 0; 
     for(char c: str.trim().toCharArray() { 
      if(!Character.isDigit(c) { 
       System.out.println("In line" + line + " char " + i + " isn't digit") 
      } 
      i++; 
     } 
     line++;  
    } 
+0

Точно! Отличный ответ. Принимая этот ответ. Спасибо. – golobich

+1

Ввод не имеет значений с плавающей запятой, поэтому вместо '[^ \\ d.]' Можно использовать '\\ D'. – Pshemo

+1

Чтобы улучшить это, этот «невидимый символ» является [отметкой порядка байтов UTF-8] (https://en.wikipedia.org/wiki/Byte_order_mark). – Tom

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