有一个文件包含多个版本的应用程序名称:(v1,v2,v3)仅需要打印具有应用程序名称的最新版本(v3)的文件。
文件内容:
MailApp AuthenticationAPI v6
Videoapp CallAppAPI v7
MailApp DataStorageAPI v10
Videoapp DataStorageAPI v11
MailApp AuthenticationAPI v11
ChatApp DataStorageAPI v2
ChatApp DataStorageAPI v3
我编写了以下代码:
public class FileProblem {
public void readFile() {
try {
File file = new File("D:\\cucumber\\Versions.txt");
BufferedReader fos = new BufferedReader(new FileReader(file));
String sCurrentLine;
int i =0;
String temp;
ArrayList<String> ar = new ArrayList<String>();
Scanner s = new Scanner(file);
//List<String> names = new ArrayList<String>();
Iterator<String> itr = ar.iterator();
while ((sCurrentLine = fos.readLine()) != null) {
String[] arr = sCurrentLine.split(" ");
Map<String, String> hs = new TreeMap<String, String>();
//hs.put(arr[0], arr[2]);
hs.put(arr[0],arr[2]);
if(arr.length == 4) {
System.out.println("arr[3] = " + arr[3]);
}
Iterator<Entry<String, String>> itr1 = hs.entrySet().iterator();
while(itr1.hasNext()) {
System.out.println(itr1.next());
}
}
}
catch(Exception e) {
System.out.println(e);
}
}
public static void main(String args[]) {
FileProblem fp = new FileProblem();
fp.readFile();
}
}
但是我坚持按值对HashMap进行排序,因为它包含带数字的字符串。请帮忙
答案 0 :(得分:1)
假设文件除版本号外没有其他数字,您可以创建自己的比较器,如下所示:
Comparator<String> versionComparator =
Comparator.comparingDouble(s -> Double.valueOf(s.replaceAll("\\D+", "")));
replaceAll("\\D+", "")
使您可以摆脱字符串中的任何非数字符号。
接下来要从Java 8中使用collect
获取每个应用程序的最新版本:
Map<String, Optional<String>> map = Files.lines(Paths.get(PATH_TO_FILE))
.collect(groupingBy(s -> s.split(" ")[0], maxBy(versionComparator)));
现在只需打印
map.forEach((key, value) -> System.out.println(value.orElse("Not Found")));