JAVA 读入txt文档 并对属性列排序

2025-05-18 10:55:37
推荐回答(2个)
回答1:

import java.io.*;
import java.util.*;
public class TextFileDemo {
public static void main(String[] args)throws Exception{
TreeSet ts = getReader("D:\\a.txt");
for(Iterator it = ts.iterator(); it.hasNext();){
FileClass fc = it.next();
System.out.println(fc.toString());
}
}
private static TreeSet getReader(String pathName)throws Exception{
BufferedReader br = new BufferedReader(new FileReader(pathName));
String str = null;
List list = new ArrayList();
while((str=br.readLine())!=null){
list.add(str);
}
br.close();
TreeSet set = new TreeSet();
for(int i = 0; i < list.size(); i++){
if(i == 0){
String[] arr = list.get(i).split(" +");
for(String s : arr)
System.out.print(s+"\t");
}else{
String[] arr = list.get(i).split(" +");
if(arr.length == 5)
set.add(new FileClass(arr[0],arr[1],arr[2],arr[3],arr[4],""));
else
set.add(new FileClass(arr[0],arr[1],arr[2],arr[3],arr[4],arr[5]));
}
}
System.out.println();
return set;
}

}
class FileClass implements Comparable{
private String id;
private String headache;
private String muscle;
private String pain;
private String temperature;
private String flu;
public FileClass(String id, String headache, String muscle, String pain, String temperature, String flu){
this.id = id;
this.headache = headache;
this.muscle = muscle;
this.pain = pain;
this.temperature = temperature;
this.flu = flu;
}
public String toString(){
return id+"\t"+headache+"\t\t"+muscle+"\t"+pain+"\t"+temperature+"\t\t"+flu;
}
public int compareTo(FileClass o1) {
int num = o1.headache.compareTo(this.headache);
if(num==0)
return 1;
else
return num;
}
}

//输出结果:

回答2:

看不懂你这个输出顺序


如果按“对muscle pain  temperature flu 列排序 “

 输出应该muscle pain为yes的都在前面。。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
static public enum ETemp{
NORMAL("normal",0),HIGH("high",1),VERY_HIGH("very_high",2);
final public String text;
final public int v;
ETemp(String t,int v){ text=t;this.v=v;}
public String toString(){return text;}

}
static public class Patient{
public int id;
public boolean headache, muscle_pain,flu;
public ETemp temperature;      
public String toString(){
return "e"+id+"\t"+(headache?"yes":"no")+"\t"+
(muscle_pain?"yes":"no")+"\t"+
temperature+"\t"+(flu?"yes":"no");
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
Pattern pn=Pattern.compile(
"e(\\d+)\\s{2,}(yes|no)\\s{2,}(yes|no)\\s{2,}(normal|very high|high)\\s{2,}(yes|no)");
Files.lines(new File("data.txt").toPath()).map((line)->{
Matcher m=pn.matcher(line);
Patient p=null;
if(m.find()){
p=new Patient();
p.id=Integer.parseUnsignedInt(m.group(1));
p.headache=m.group(2).equals("yes");
p.muscle_pain=m.group(3).equals("yes");
switch(m.group(4)){
case "normal":default:p.temperature=ETemp.NORMAL;break;
case "high":p.temperature=ETemp.HIGH;break;
case "very high":p.temperature=ETemp.VERY_HIGH;break;
}
p.flu=m.group(5).equals("yes");

return p;
}).filter((p)->p!=null).sorted((a,b)->{
int mr=(b.muscle_pain?1:0)-(a.muscle_pain?1:0),
fr=(b.flu?1:0)-(a.flu?1:0),
tr=a.temperature.v-b.temperature.v;
return mr!=0?mr: (tr!=0?tr:fr);
}).forEach((o)->System.out.println(o));
}
}
e9	yes	yes	normal	yes
e1 yes yes normal no
e4 no yes normal no
e8 no yes normal no
e2 yes yes high yes
e3 yes yes very_high yes
e6 no yes very_high yes
e7 yes no high yes
e10 no no high yes
e5 no no high no

java 8的代码,需要java 8运行。按musclepain > temperature>flu的顺序。。。

看了半天看不懂你样例输出中到底是什么顺序,你所给的样例输出不符合任何顺序,需要解释再说。