5

जैसा प्रतीत होता है मुझे एक जावा प्रोग्राम के साथ एक छोटी सी समस्या है। मैं एक InsertionSort एल्गोरिदम करने की कोशिश कर रहा हूं, लेकिन यह स्ट्रिंग को परिवर्तित करने में समस्या है जो प्रोग्राम stdin के माध्यम से हो जाता है। यह कार्यक्रम की तरह लगता है कुछ संख्या के साथ काम कर रहा है, लेकिन यह इन नंबरों के साथ काम नहीं करता है:स्ट्रिंग के लिए संख्याफॉर्मेट अपवाद जो

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

स्कैनर वर्ग एक विधि 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

इसे थोड़ा सुधारने के लिए: यह "अदृश्य चार" एक [यूटीएफ -8 बाइट ऑर्डर मार्क] है (https://en.wikipedia.org/wiki/Byte_order_mark)। – Tom

संबंधित मुद्दे