5

1つのJavaプログラムで少し問題があります。 InsertionSortアルゴリズムを実行しようとしていますが、プログラムがstdin経由で取得する文字列を変換する際に問題があるようです。これは、いくつかの数字で働いているプログラムのように思えるが、それはこれらの数字では動作しません:それはなく、それは私のファイルと、いくつかの数字で動作します数値のように見える文字列のNumberFormatException

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

:これは私のアルゴリズムである https://dl.dropboxusercontent.com/u/57540732/numbers.txt

あなたに提供されます。私は次の例外を受け取ります:

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

関連する問題