按自然顺序对 .csv Id 进行排序 Java

Sorting .csv Id's in natural order Java

我正在尝试编写一些代码,从 .csv 文件中获取 ID(数字和字母)列表,并将它们输出到 ID 在 "natural order" 中的新文件。我的文件正在编译,但出现错误:

java.lang.NumberFormatException: For input string: "Alpha"

我认为问题是我没有考虑 .csv 文件中的数字和字母值。我究竟做错了什么?!抱歉,如果我的变量 ID 令人困惑...

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;


public class IdReader {

    public static String CSV_FILE_PATH = "/Users/eringray/Desktop/idreader/idData.csv";

    public static void main(String[] args){

        try {

            BufferedReader br = new BufferedReader(new FileReader(CSV_FILE_PATH));
            BufferedWriter bw = new BufferedWriter(new FileWriter(CSV_FILE_PATH + ".tsv"));

            ArrayList<String> textIds = new ArrayList<>();
            ArrayList<Integer> numberIds = new ArrayList<>();

            String line = "";
            while((line = br.readLine()) != null) {
                String[] values = line.split(" ");

                if(values.length == 1) {
                    String idAsString = values[0];

                try{
                    int id = Integer.parseInt(idAsString);
                    numberIds.add(id);
                }
                catch(NumberFormatException e){
                    textIds.add(idAsString);
                }

                }
            }

            Collections.sort(textIds);
            Collections.sort(numberIds);


            for(int i = 0; i < textIds.size(); i++){
                String stu = textIds.get(i);
                String lineText = stu.toString();
                bw.write(lineText);
                bw.newLine();
            }

             for(int i = 0; i < numberIds.size(); i++){
                int numValues = numberIds.get(i);
                bw.write(numValues);
                bw.newLine();
            }

            br.close();
            bw.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

异常出现在这一行

int id = Integer.parseInt(idAsString);

显然 alpha 不是整数,所以它会抛出 NumberFormatException。遇到这种不能转成数字的String,可以直接跳过,也可以抛异常。

更新

//Use two seperate lists, one for maintaining numbers and other for text
      ArrayList<String> textIds = new ArrayList<>();
        ArrayList<Integer> numberIds = new ArrayList<>();
        String line = "";
        while((line = br.readLine()) != null) {
          String[] values = line.split(" ");

          if(values.length == 1) {
            String idAsString = values[0];

            try {
               //Parse the value. If successful, it means it was a number. Add to integer array.
               int id = Integer.parseInt(idAsString);
               numberIds.add(id);
            }catch (NumberFormatException e){

              //If not successful, it means it was a string.
               textIds.add(idAsString);
            }
          }
        }
         //In the end sort both the list
        Collections.sort(textIds);
        Collections.synchronizedList(numberIds);

 for(int i = 0; i < textIds.size(); i++){
                String stu = textIds.get(i);
                bw.write(stu);
                bw.newLine();
            }

             for(int i = 0; i < numberIds.size(); i++){
                int numValues = numberIds.get(i);
                bw.write(numValues+"");
                bw.newLine();
            }

            br.close();
            bw.close();

我没有将用于将此数据写入新文件的代码。希望你能做到。

示例输入

4

6

33

2

5632

23454

阿尔法

所以在 运行 我的代码

之后

numberIds 将有 [ 2,4,6,33,5632,23454] textIds 将有 ["Alpha"]

NumberFormatException 由于输入中的字母数字字符而发生。

请使用 https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html api 中的 isNumeric(str) 方法验证输入是否为数字并转换为 int ,只有它是数字