2016-10-13 20 views
0

我只需要将具有8位数字而不是单词的数字存储到数组中,并且如果它不是那么只是将其打印到控制台。一旦进入阵列,我必须对它们进行排序并将它们打印到右侧,左侧有未排序的列表。如何用逗号和词语读取文件,并只将数字存储在数组中?

所以我被逗留在一个带有逗号的文件,它只有在没有逗号或空格时才起作用。我应该使用方法“compareTo”和“StringTokenizer”我知道他们如何工作,但只是不做我想要的,也许我把它放在错误的功能。我还需要将这个文件分开,并放入一个单独的文件中,GUI功能不知道要在该文件上放置什么。

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

}

文本文件有以下几点:

20080912,20131120,19980927,\ n 20020202,你好

回答

0

您可以使用一个正则表达式来执行此操作。一个适当的为您的要求是:

(\d{8})

此正则表达式匹配的连续8位组输入数据。

我使用下面的代码片段测试了它,并能够从输入字符串中检索所有8位数字。

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

把它当成镜头。希望这可以帮助!

相关问题