5

Ho un piccolo problema con un programma JAVA. Sto provando a fare un algoritmo InsertionSort, ma sembra essere il problema con la conversione di String che il programma ottiene tramite stdin. Sembra che il programma sta lavorando con alcuni numeri, ma non funziona con questi numeri: https://dl.dropboxusercontent.com/u/57540732/numbers.txtNumberFormatException per String che sembra essere un numero

Questo è il mio algoritmo:

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) + " "); 
     } 
    } 
} 

Funziona con pochi numeri, ma non con i file che ho fornito a voi. Ottengo seguente eccezione:

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) 

Non so perché ottengo questa eccezione, perché la stringa di input è un numero (4531). Eventuali suggerimenti? Non posso copiare e incollare al dei numeri da file al terminale, quindi sto usando questo comando:

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

Credo che il problema è con nextLine() –

+0

classe Scanner ha un metodo chiamato nextInt() e hasNextInt(). Forse dovresti provare a usarli invece di analizzare la stringa in un numero intero. – abekenza

risposta

4

Hai char invisibile in "4531".

Come risolto questo:

Dopo:

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

scrittura:

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

Come pensano che questa char:

Dopo:

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

scrittura:

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

Esattamente! Risposta perfetta Accettare questa risposta Grazie. – golobich

+1

L'input non sembra avere valori in virgola mobile, quindi '\\ D' può essere usato al posto di' [^ \\ d.] '. – Pshemo

+1

Per migliorare un po 'questo: questo "carattere invisibile" è un [segno di ordine UTF-8 Byte] (https://en.wikipedia.org/wiki/Byte_order_mark). – Tom