5

Tôi có một vấn đề nhỏ với một chương trình JAVA. Tôi đang cố gắng để làm một thuật toán InsertionSort, nhưng nó có vẻ là vấn đề với chuyển đổi String chương trình được thông qua stdin. Nó có vẻ như chương trình đang làm việc với vài con số, nhưng nó không làm việc với những con số: https://dl.dropboxusercontent.com/u/57540732/numbers.txtNumberFormatException cho Chuỗi có vẻ là một số

Đây là thuật toán của tôi:

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

Nó hoạt động với vài con số, nhưng không phải với file tôi cung cấp cho bạn. Tôi nhận được ngoại lệ sau:

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) 

Tôi không biết tại sao tôi nhận ngoại lệ này, vì chuỗi đầu vào là một số (4531). Bất kỳ đề xuất? tôi không thể sao chép và dán al của các số từ tập tin vào thiết bị đầu cuối, vì vậy tôi đang sử dụng lệnh này:

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

tôi nghĩ rằng vấn đề là với nextLIne() –

+0

lớp Scanner có một phương pháp gọi là nextInt() và hasNextInt(). Có lẽ bạn nên thử sử dụng chúng thay vì phân tích chuỗi thành một số nguyên. – abekenza

Trả lời

4

Bạn có char vô hình trong "4531".

bao cố định này:

Sau:

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

Viết:

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

Làm thế nào tìm thấy char này:

Sau:

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

Viết:

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

Chính xác! Câu trả lời hoàn hảo. Chấp nhận câu trả lời này. Cảm ơn bạn. – golobich

+1

Đầu vào dường như không có giá trị dấu phẩy động sao cho '\\ D' có thể được sử dụng thay cho' [^ \\ d.] '. – Pshemo

+1

Để cải thiện điều này một chút: "char vô hình" này là [dấu thứ tự UTF-8 Byte] (https://en.wikipedia.org/wiki/Byte_order_mark). – Tom

Các vấn đề liên quan