首页 > 解决方案 > 从文件中提取具有最新版本的应用程序

问题描述

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

标签: javafilecollections

解决方案


假设您的文件除了版本号之外没有任何数字,您可以像这样创建自己的比较器:

Comparator<String> versionComparator = 
    Comparator.comparingDouble(s -> Double.valueOf(s.replaceAll("\\D+", "")));

replaceAll("\\D+", "")允许您摆脱字符串中的任何非数字符号。

接下来collect从 java 8 获取每个应用程序使用的最新版本:

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

推荐阅读