2016-10-13 1 views
0

J'ai besoin de stocker seulement des nombres qui ont 8 chiffres et pas un mot dans un tableau, et si ce n'est pas alors juste pour l'imprimer à la console. Une fois dans le tableau, je dois les trier et les imprimer dans le côté droit et le côté gauche a la liste non triée.Comment ai-je besoin de lire un fichier avec des virgules et des mots et uniquement stocker des nombres dans un tableau?

Je suis donc coincé dans un fichier avec des virgules, il ne fonctionne que lorsqu'il n'a pas de virgules ou d'espace. Je suis censé utiliser la méthode "compareTo" et le "StringTokenizer" je sais comment ils fonctionnent tous les deux mais ne fait pas ce que je veux, peut-être que je le mets dans la mauvaise fonction. J'ai également besoin de séparer ce fichier et mettre dans un fichier séparé les fonctions de l'interface graphique ne sais pas quoi mettre sur ce fichier.

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

}

le fichier texte les éléments suivants sont:

20080912,20131120,19980927, \ n 20020202, bonjour

Répondre

0

Vous pouvez utiliser une expression régulière pour effectuer cela. Celle qui convient à votre exigence serait:

(\d{8})

Ce regex correspond à des groupes de 8 chiffres consécutifs dans vos données d'entrée.

J'ai testé cela en utilisant l'extrait ci-dessous et j'ai pu récupérer tous les nombres à 8 chiffres de votre chaîne d'entrée.

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; 
    } 
} 

Donnez-le comme plan. J'espère que cela t'aides!