我有一个包含三个人的dats的文本文件。每个人的属性用逗号分隔。它看起来像这样:
Patrick, Gary, Male, Blue, 1/28/1948
Carson, Larry, Male, Pink, 11/24/1976
Fisher, Paul, Male, Orange, 5/12/1995
我最终要做的是按照他们的姓氏按升序对这些人进行排序。
我不确定我是否正确地考虑这个问题,但我想创建一个2D数组,将每个属性分配给正确的行和列。我们现在可以忘记排序了。
如何让每一行填充数组的一行,每个单独的属性都在自己的列中?
也许我应该逐行读取文件,然后使用lineFromFile.charAt(index)将每个字符添加到2D数组中以填充或类似的东西?任何样本建议都将不胜感激。
答案 0 :(得分:1)
String.split()
可以提供帮助:
person[i] = line.split(", ");
但你真正想要的是放弃二维数组的想法并创建一个人员列表,其中Person是你定义的一个类。
public class Person {
public final String firstName;
public final String lastName;
public final String birthDate; //should really be a java.util.Date
//...plus a constructor for the above
}
//...
List<Person> people = new ArrayList<Person>();
String line = reader.readLine();
String[] fields = line.split(", ");
people.add(new Person(fields[0], fields[1], /*...*/));
2D数组几乎总是暗示您需要一个类来表示数据的“行”。
排序变得非常简单:
//sorts the people in descending order by first name
people.sort(new Comparator<Person>() {
public int compare(Person a, Person b) {
b.firstName.compareTo(a.firstName);
}
});
答案 1 :(得分:0)
我建议不要使用2D数组并使用你提到的字段创建一个类(按照@ Mark的帖子)。然后创建该类的一维实例数组。
但是,如果你想进入2D阵列路线:
String[][] people = new String[][] {
{"Patrick", "Gary", "Male", "Blue", "1/28/1948"},
{"Carson", "Larry", "Male", "Pink", "11/24/1976"},
{"Fisher", "Paul", "Male", "Orange", "5/12/1995"}
};
答案 2 :(得分:0)
假设你可以找一个读者
StringReader in = new StringReader(
"Patrick, Gary, Male, Blue, 1/28/1948\n" +
"Carson, Larry, Male, Pink, 11/24/1976\n" +
"Fisher, Paul, Male, Orange, 5/12/1995");
您可以使用缓冲读卡器逐行阅读,并使用列表累积行
List<String[]> splitLines = new ArrayList<String[]>();
try {
BufferedReader lineIn = new BufferedReader(in);
for (String line; (line = lineIn.readLine()) != null;) {
String[] lineParts = line.split(",");
// Maybe check that lineParts has the right length here.
splitLines.add(lineParts);
}
} finally {
in.close();
}
然后你可以将列表转换为二维数组。
String[][] linesArray = splitLines.toArray(new String[][] {});
然后您可以使用自定义比较器进行排序。
Array.sort(linesArray, new Comparator<String[]>() {
public int compare(String[] linea, String[] lineb) {
... // the date should be in linea[4] and lineb[4].
}
})();