从文件中提取具有最新版本的应用

时间:2019-02-07 13:33:32

标签: java file collections

有一个文件包含多个版本的应用程序名称:(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进行排序,因为它包含带数字的字符串。请帮忙

1 个答案:

答案 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")));