2016-10-13 1 views
0

Ich muss nur Zahlen speichern, die 8 Ziffern und kein Wort in einem Array haben, und wenn es nicht nur ist, um es auf der Konsole zu drucken. Einmal im Array muss ich sie sortieren und sie in die rechte Seite drucken und die linke Seite hat die unsortierte Liste.Wie muss ich eine Datei mit Kommata und Wörtern lesen und nur Zahlen in einem Array speichern?

Also ich bin in einer Datei mit Kommas fest, es funktioniert nur, wenn es keine Kommas oder Leerzeichen hat. Ich soll die Methode "compareTo" und den "StringTokenizer" verwenden. Ich weiß, wie beide funktionieren, aber ich mache einfach nicht das, was ich will, vielleicht stelle ich es in die falsche Funktion. Ich muss auch diese Datei trennen und in eine separate Datei die GUI-Funktionen nicht sicher, was Sie auf diese Datei legen.

public class Project1 { 
static final int LIST_SIZE = 10; 
static int ssnSize; 
static String line; 
static String[] ssnList; 
static TextFileInput inFile; 
static String inFileName = "Dates.txt"; //save the file in Lab12 folder on BB in your project folder 
static JFrame myFrame; 
static Container myContentPane; 
static TextArea left, right; 

public static void main(String[] args) { 
    initialize(); 
    readNumbersFromFile(inFileName); 
    printSSNList(ssnList,ssnSize); 
    printSSNtoJFrame(myFrame,ssnSize); 
} 

public static void initialize() { 
    inFile = new TextFileInput(inFileName); 
    ssnList= new String[LIST_SIZE]; 
    ssnSize=0; 
    line =""; 
    left = new TextArea(); 
    right = new TextArea(); 
    myFrame = new JFrame(); 
    myFrame.setSize(400, 400); 
    myFrame.setLocation(200, 200); 
    myFrame.setTitle(""); 
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

public static void readNumbersFromFile(String fileName) 
{ 
     String ssn; 
     ssn = inFile.readLine(); 
     while (ssn != null) { 
      assert (isValidDate(ssn)): "SSN not valid"; 
      if (!isValidDate(ssn)) 
       throw new IllegalArgumentException("Invalid SSN"); 
      else 
       storeDates(ssn,ssnList); 
      ssn = inFile.readLine(); 
     } //while 

} //readSSNsFromFile 

public static void printSSNList(String[] list, int size) 
{ 
     assert (isValidList(list)): "The array is not valid"; 
     if (!isValidList(list)){ 
      throw new IllegalArgumentException("Invalid list)"); 
     } 
     for (int i=0;i<size;i++) 
      if (!isValidDate(list[i])) 
       System.out.println("Invalid SSN: "+list[i]); 
      else 
       System.out.println(list[i]); 
} 

public static void storeDates(String s, String[] list) 
{ 
     assert (isValidDate(s)): "The SSN is not valid"; 
     assert (isValidList(list)): "The array is not valid"; 

     if (isValidDate(s) && isValidList(list)) 
      list[ssnSize++]=s; 
     assert (isValidList(list)):"Resulting list not valid"; 
} 

public static void printSSNtoJFrame(JFrame jf, int size) 
{ 
     assert (isValidList(ssnList)): "The array is not valid"; 
     if (!isValidList(ssnList)){ 
      throw new IllegalArgumentException("Invalid list)"); 
     } 

     jf.setLayout(new GridLayout(1, 2)); 
     myContentPane = jf.getContentPane(); 
     TextArea myLeftArea = new TextArea(); 
     TextArea myRightTextArea = new TextArea(); 
     myContentPane.add(myLeftArea); 
     myContentPane.add(myRightTextArea); 


     for (int i=0;i<size;i++) 
     { 
       if (!isValidDate(ssnList[i])) 
        myLeftArea.append("Invalid SSN: "+ssnList[i]+"\n"); 
       else 
       { 
        myLeftArea.append(ssnList[i]+"\n"); 
       } 
     } 


     sortOnlyNumbers(ssnList); 

     for(int j=0; j< size; j++) 
     { 
       myRightTextArea.append(ssnList[j]+"\n"); 
     } 
     jf.setVisible(true); 
} 

private static void sortOnlyNumbers(String[] array) 
{ 
    List<Integer> indexes = new ArrayList<Integer>(); 
    List<Integer> numbers = new ArrayList<Integer>(); 
    for (int i = 0; i < array.length; i++) { 
     try { 
      numbers.add(Integer.parseInt(array[i])); 
      indexes.add(i); 
     } catch (NumberFormatException e) { 
      // don't care 
     } 
    } 
    Collections.sort(numbers, Collections.reverseOrder()); 
    for (int i = 0; i < numbers.size(); i++) { 
     array[indexes.get(i)] = String.valueOf(numbers.get(i)); 
    } 
} 

public static boolean isValidDate(String s) 
{ 
     if (s.length() != 8) { 
     throw new IllegalArgumentException("An SSN length must be 9"); 
     } 
     for (int i=0;i<8;i++) 
      if (! Character.isDigit(s.charAt(i))) { 
       throw new IllegalArgumentException("SSN must have only digits."); 
     } 
     return (true); 
} 

public static boolean isValidList(String[] list) 
{ 
     if (list == null){ 
      return false; 
     } 
     if (ssnSize == list.length){ 
      return false; 
     } 
     return (true); 
} 

}

die Textdatei hat folgendes:

20080912,20131120,19980927, \ n 20.020.202, hallo

Antwort

0

können Sie verwenden ein regulärer Ausdruck, um dies auszuführen. Ein passender für Ihre Anforderung wäre:

(\d{8})

Diese Regex entspricht Gruppen von 8 aufeinander folgenden Ziffern in Ihren Eingabedaten.

Ich habe dies anhand des unten stehenden Snippets getestet und konnte alle 8-stelligen Zahlen aus Ihrer Eingabezeichenfolge abrufen.

public class Snippet { 
    public static void main(String[] args) { 
     String input = "20161001 20080912,20131120,19980927, \n 20020202,hello 20120104"; 
     List<String> matches = get8DigitNumbersOnly(input); 
     System.out.println(matches); 
    } 

    public static List<String> get8DigitNumbersOnly(String inputData) { 
     Pattern pattern = Pattern.compile("(\\d{8})"); // This is the regex. 
     Matcher matcher = pattern.matcher(inputData); 
     List<String> matches = new ArrayList<String>(); 
     while(matcher.find()) { 
      String match = matcher.group(); 
      matches.add(match); 
     } 
     return matches; 
    } 
} 

Geben Sie es als Schuss. Hoffe das hilft!

Verwandte Themen