我正在尝试根据前两列值对文件内容进行排序:
我的文件内容是:
文件名:ComplexMapFileReader.txt
并且内容是:
B 12 hgjhgjgjgjgjgjhgjgjgjgjgjgj
B 3 jgjdSAGdjgsdKJADJgjfgAJFL
B 6 jygtjgjgjgjgjgjhgjhbj
C 7 uiyuiyikykk
C 2 wrteyytyuiiiiyjhg
A 1 hikhkhkhkjhkhkhjkhkh
A 4 khkhkkhkhkhkhkh
A 2 khkhkhkhkhkhkhkhkhkhkhkhh
A 11 jhgjsGJDGjAGFjgfjgjfgj
A 5 gjgjgsadgajgjDGkkhkhdDKjhkjd
B 5 hdskdhkljdhKAJHDKjahsd
A 12 kjhkdjhfknkjflkjfsdlkjf
C 3 kjhfekJEHFKHefkh
B 34 khkhkjhkjhkqlwwjljlllljj
A 21 iuhEWHRIekhrlkHRKErhwkrhk;h;kfnk.nfas
C 11 jlklkqwwlklklklllklkkkkjjj
我的代码是:
package CollectionExamples;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
public class MapFileReader {
private static final String FILENAME = "D:\\ComplexMapFileReader.txt";
public static void main(String[] args) {
BufferedReader br = null;
FileReader fr = null;
Map<Integer, String> innerMap = null;
Map<String, TreeMap> outerMap = new TreeMap();
try {
fr = new FileReader(FILENAME);
br = new BufferedReader(fr);
String sCurrentLine;
br = new BufferedReader(new FileReader(FILENAME));
try {
while ((sCurrentLine = br.readLine()) != null) {
String[] s = sCurrentLine.split(" ");
if (!outerMap.containsKey(s[0])) {
innerMap = new TreeMap();
innerMap.put(Integer.valueOf(s[1]), s[2]);
outerMap.put(s[0], (TreeMap) innerMap);
} else {
innerMap.put(Integer.valueOf(s[1]), s[2]);
outerMap.put(s[0], (TreeMap) innerMap);
}
}
String s0 = null;
String s1 = null;
String s2 = null;
for (Entry<String, TreeMap> map1 : outerMap.entrySet()) {
s0 = map1.getKey();
for (Entry<Integer, String> map2 : innerMap.entrySet()) {
s1 = " "+map2.getKey() + "";
s2 =" "+ map2.getValue();
System.out.println("Each line equals:" + s0 + s1 + s2);
System.out.println("#############");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面的代码没有给我想要的结果。但是当上面的文件是某种有序的(Alphabets all B's在一起或A在一起)时,如下所示的文件内容给出了正确的排序:
B 12 hgjhgjgjgjgjgjhgjgjgjgjgjgj
B 3 jgjdSAGdjgsdKJADJgjfgAJFL
B 6 jygtjgjgjgjgjgjhgjhbj
C 7 uiyuiyikykk
C 2 wrteyytyuiiiiyjhg
A 1 hikhkhkhkjhkhkhjkhkh
A 4 khkhkkhkhkhkhkh
A 2 khkhkhkhkhkhkhkhkhkhkhkhh
A 11 jhgjsGJDGjAGFjgfjgjfgj
A 5 gjgjgsadgajgjDGkkhkhdDKjhkjd
结果是所需的结果(按字母排序,然后按数字排序):
输出:
Each line equals:A 1 hikhkhkhkjhkhkhjkhkh
#############
Each line equals:A 2 khkhkhkhkhkhkhkhkhkhkhkhh
#############
Each line equals:A 4 khkhkkhkhkhkhkh
#############
Each line equals:A 5 gjgjgsadgajgjDGkkhkhdDKjhkjd
#############
Each line equals:A 11 jhgjsGJDGjAGFjgfjgjfgj
#############
Each line equals:B 1 hikhkhkhkjhkhkhjkhkh
#############
Each line equals:B 2 khkhkhkhkhkhkhkhkhkhkhkhh
#############
Each line equals:B 4 khkhkkhkhkhkhkh
#############
Each line equals:B 5 gjgjgsadgajgjDGkkhkhdDKjhkjd
#############
Each line equals:B 11 jhgjsGJDGjAGFjgfjgjfgj
#############
Each line equals:C 1 hikhkhkhkjhkhkhjkhkh
#############
Each line equals:C 2 khkhkhkhkhkhkhkhkhkhkhkhh
#############
Each line equals:C 4 khkhkkhkhkhkhkh
#############
Each line equals:C 5 gjgjgsadgajgjDGkkhkhdDKjhkjd
#############
Each line equals:C 11 jhgjsGJDGjAGFjgfjgjfgj
#############
但是当文件的内容如下所示时,我得不到想要的结果。我知道因为它是map,它将覆盖以下情况中的先前值。但有没有更好的方法来解决这个问题。
B 12 hgjhgjgjgjgjgjhgjgjgjgjgjgj
B 3 jgjdSAGdjgsdKJADJgjfgAJFL
B 6 jygtjgjgjgjgjgjhgjhbj
C 7 uiyuiyikykk
C 2 wrteyytyuiiiiyjhg
A 1 hikhkhkhkjhkhkhjkhkh
A 4 khkhkkhkhkhkhkh
A 2 khkhkhkhkhkhkhkhkhkhkhkhh
A 11 jhgjsGJDGjAGFjgfjgjfgj
A 5 gjgjgsadgajgjDGkkhkhdDKjhkjd
B 5 hdskdhkljdhKAJHDKjahsd
A 12 kjhkdjhfknkjflkjfsdlkjf
C 3 kjhfekJEHFKHefkh
B 34 khkhkjhkjhkqlwwjljlllljj
A 21 iuhEWHRIekhrlkHRKErhwkrhk;h;kfnk.nfas
C 11 jlklkqwwlklklklllklkkkkjjj
答案 0 :(得分:-1)
我认为这是用Record对象表示每一行的更好方法。实际上我们不需要TreeMap进行排序。如果您想添加更多字段或更改比较逻辑,它会更方便。对于记录列表,我们只需要实现Comparable接口来实现比较逻辑。
例如:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MapFileReader {
private static final String FILENAME = "D:\\ComplexMapFileReader.txt";
private static class Record {
private char ch;
private int num;
private String string;
public void setCh(char ch) {
this.ch = ch;
}
public char getCh() {
return ch;
}
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
}
public static void main(String[] args) {
BufferedReader br;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader(FILENAME));
List<Record> records = new ArrayList<>();
try {
while ((sCurrentLine = br.readLine()) != null) {
String[] s = sCurrentLine.split(" ");
if (s.length != 3) {
// Filter invalid records
continue;
}
Record r = new Record();
r.ch = s[0].charAt(0);
r.num = Integer.parseInt(s[1]);
r.string = s[2];
records.add(r);
}
Collections.sort(records, new Comparator<Record>() {
@Override
public int compare(Record o1, Record o2) {
if (o1.ch == o2.ch) {
return o1.num < o2.num ? -1 : (o1.num == o2.num ? 0 : 1);
}
return o1.ch < o2.ch ? -1 : 1;
}
});
for (Record record : records) {
System.out.println(String.format("Each line equals: %s %s %s", record.ch, record.num, record.string));
System.out.println("#############");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}