我有一个字符串数组列表。这些字符串的结构如下:
xxxx_Contract_2.1.0.xlsx
最后一位数字指的是版本。因此,我试图获取每个合同的最新版本,以将包含合同最新版本的所有字符串都放在列表A中,而来自同一合同旧版本的所有其他字符串都列在列表B中。
我脑子里有不同的解决方案,但是它们似乎总是肮脏的解决方法,如果我的主管更改结构,这些解决方法可能会失效。是否有人知道如何获取特定合同的字符串,该特定合同是该合同的最新版本?
答案 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问题和答案。