我如何阅读带有逗号和单词的文件,只在数组中存储数字?

时间:2016-10-13 03:18:32

标签: java arrays user-interface jframe stringtokenizer

我只需要将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);
}

}

文本文件包含以下内容:

  

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

1 个答案:

答案 0 :(得分: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;
    }
}

将其作为镜头。希望这有帮助!