Java:拆分字符串并根据值存储在ArrayList中

时间:2018-09-18 08:14:54

标签: java string arraylist version

我有一个字符串数组列表。这些字符串的结构如下:

xxxx_Contract_2.1.0.xlsx

最后一位数字指的是版本。因此,我试图获取每个合同的最新版本,以将包含合同最新版本的所有字符串都放在列表A中,而来自同一合同旧版本的所有其他字符串都列在列表B中。

我脑子里有不同的解决方案,但是它们似乎总是肮脏的解决方法,如果我的主管更改结构,这些解决方法可能会失效。是否有人知道如何获取特定合同的字符串,该特定合同是该合同的最新版本?

3 个答案:

答案 0 :(得分:1)

我将为文件版本创建方案major.minor.bug。您需要解析这些值,然后使其具有可比性。

这是一个实现。

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Scratch {
    public static void main(String[] args) throws Exception {
        List<String> files = new ArrayList<>();
        files.add("xxxx_Contract_2.1.0.xlsx");
        files.add("xxxx_Contract_2.2.0.xlsx");
        files.add("xxxx_Contract_2.1.3.xlsx");
        files.add("xxxx_Contract_4.6.3.xlsx");
        files.add("xxxx_Contract_4.6.2.xlsx");

        Version latest = null;
        for (String file : files) {
            if (latest == null) {
                latest = new Version(file);
                continue;
            }
            Version v = new Version(file);
            if (latest.compareTo(v) < 0) {
                latest = v;
            }
        }

        System.out.println("Latest version " + latest.filename);
    }

    static class Version implements Comparable<Version> {
        private static final String VERSION_REGEX = ".*(\\d+)\\.(\\d+)\\.(\\d+).*";
        private static final Pattern REGEX;
        static {
            REGEX = Pattern.compile(VERSION_REGEX);
        }

        private String filename;
        private Integer major;
        private Integer minor;
        private Integer bug;

        public Version(String filename) throws Exception {
            Matcher m = REGEX.matcher(filename);
            if (!m.matches()) {
                throw new Exception("Invalid filename " + filename);
            }

            this.filename = filename;
            this.major = Integer.valueOf(m.group(1));
            this.minor = Integer.valueOf(m.group(2));
            this.bug =  Integer.valueOf(m.group(3));
        }

        @Override
        public int compareTo(Scratch.Version o) {
            int result = major.compareTo(o.major);
            if (result != 0) {
                return result;
            }
            result = minor.compareTo(o.minor);
            if (result != 0) {
                return result;
            }
            result = bug.compareTo(o.bug);
            return result;
        }
    }
}

结果: 最新版本xxxx_Contract_4.6.3.xlsx

答案 1 :(得分:1)

只要版本遵循以下一般可能的结构,

MajorVersion.MinorVersion.BugFixVersion

例如2.1.0

无论主管如何更改文件名结构,您都可以使用以下正则表达式从文件名字符串中提取该文件

\\d+[.]\\d+[.]\\d+

例如如果将文件名更改为xxxx_Contract_2.1.0_abcd.xlsx或xxxx_2.1.0_Contract_.xlsx或2.1.0_xxxx_Contract.xlsx,则正则表达式肯定会提取您感兴趣的版本文本。

一旦找到并收集了所有版本,例如在ArrayList中,请编写一个Comparator对这些版本进行排序并获得最小值或最大值。如果您在编写比较器时遇到问题,请告诉我。我可以帮忙。

答案 2 :(得分:0)

要从文件名中获取版本号:

String filename = "xxxx_Contract_2.1.0.xlsx";
String version = filename.replaceAll("^.*_Contract_|\\.xlsx$", "");
System.out.println(version);  // "2.1.0"

现在,您可以使用比较器来查找最新合同,但需要小心。比较版本号可能是蠕虫病毒。关于此主题,存在各种现有的StackOverflow问题和答案。