我的问题实际上是双重的,但是首先,我试图编写一个程序,该程序按字母顺序对列表进行排序并将其写入文件,但是当尝试对文件进行排序时,使用特殊字符或数字的行被引入后,排序将不再起作用。如果列表只是以字母开头的字符串,则可以按顺序很好地进行排序和书写。
我只是在由输入文件中的行组成的字符串列表中使用Collections.sort
,然后尝试将它们写入输出文件。
我的输入文件包含以下几行:
These are some test lines
short line
abcdefghij
this line is much longer than the short line
123 456
#Ignore this line
Blah blah blah
# ignore this, too
我的输出文件最终被排序为:
# ignore this, too
#Ignore this line
123 456
Blah blah blah
These are some test lines
abcdefghij
short line
this line is much longer than the short line
对于第二个问题,我想以某种方式排除将#所包含的行写入文件。 这是我的代码:
BufferedReader inputStream = null;
PrintWriter outputStream = null;
String inFile = args[0];
String outFile = args[1];
List<String> lines = new LinkedList<>();
try {
inputStream =
new BufferedReader(new FileReader(inFile));
outputStream=
new PrintWriter(new FileWriter(outFile));
String line;
while ((line = inputStream.readLine()) != null) {
lines.add(line);
if(args[2].equals("LONGESTFIRST") ) {
Collections.sort(lines, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.length() - o1.length();
}
});
} else if (args[2].equals("SHORTESTFIRST")) {
Collections.sort(lines, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
} else if (args[2].equals("LEXICOGRAPHIC")) {
Collections.sort(lines);
} else if (args[2].equals("REVERSE")) {
Collections.sort(lines, Collections.reverseOrder());
}
}
for (int i = 0; i < lines.size(); i++) {
outputStream.println(lines.get(i));
}
我已经尝试过在诸如if(!lines.startsWith("#") {
之类的if语句中包括倒数第二行的操作,但是不幸的是,这行不通。
对不起,文字墙!
答案 0 :(得分:0)
第一件事是:您不必在每次插入后将列表排序。
第二个是:如果您不希望在输出中出现带有#
个字符的行,则只需使用list.get(i).contains("#")
进行检查。如果返回true
,请从列表中删除该行。
所以最终的算法可能看起来像这样:
list.get(i).contains("#")
或您喜欢的任何内容),如果有效,请将其写入文件。
更新:
对于不区分大小写的排序,您可能要使用CASE_INSENSITIVE_ORDER
类提供的默认比较器String
:
List<String> myList = ...;
Collections.sort(myList, String.CASE_INSENSITIVE_ORDER);
答案 1 :(得分:0)
您不必在列表中放置此类行
while ((line = inputStream.readLine()) != null) {
if (line.startsWith("#"))
continue;
lines.add(line);
// ...
}