按自然顺序对 .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 ,只有它是数字
我正在尝试编写一些代码,从 .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 ,只有它是数字