是否有一种简单的方法可以从列表中找到 MAX 号码,其中号码以x.y.z格式存储?例如管理一些系统版本。
我尝试了Collection.max(list)
,但这不起作用。
示例代码:
public static void main(String args[])
{
List<String> list = new ArrayList<String>();
list.add("1.0.0");
list.add("1.1.0");
list.add("1.9.0");
list.add("1.10.0");
System.out.println(Collections.max(list));
}
预期: 1.10.0
结果: 1.9
感谢您的时间。
答案 0 :(得分:2)
嗯,首先,你需要确保Java知道它们是数字 - 目前它们只是Strings
,字符串排序(即按字母顺序排列)。
我的方法是创建一个实现Comparable
的小类,然后它将自动使用排序和比较逻辑。也许是这样的事情:
public class VersionNumber implements Comparable<VersionNumber> {
public final int major;
public final int minor;
public final int patch;
// Constructor etc. elided
public int compareTo(VersionNumber other) {
if (other.major != major) return major - other.major;
if (other.minor != minor) return minor - other.minor;
return patch - other.patch;
}
}
解析字符串以创建此类的实例是留给读者的练习!
答案 1 :(得分:2)
尝试使用这个:
Collections.max(myList, new Comparator<String>() {
@Override
public int compare(String lhs, String rhs) {
String[] first = lhs.split("\\.");
String[] second = rhs.split("\\.");
for (int i = 0; i < first.length; i++) {
if(Integer.valueOf(first[i]) > Integer.valueOf(second[i])) {
return 1;
}
if(Integer.valueOf(first[i]) < Integer.valueOf(second[i])) {
return -1;
}
}
return 0;
}
});
答案 2 :(得分:2)
您可能必须编写自定义Comparator
来比较版本号字符串:
public class VersionComparator extends Comparator<String> {
@Override
public int compare(String o1, String o2) {
// Get major/minor/revison numbers by splitting strings at dots
String[] p1 = o1.split("\\.");
String[] p2 = o2.split("\\.");
// Compare major versions then minor then revision until a difference found
for(int i = 0; i < (p1.length < p2.length) ? p1.length : p2.length; i++) {
int result = Integer.valueOf(p1[i]).compareTo(Integer.valueOf(p2[i]));
if(result != 0) return result;
}
// Return zero if they're identical
return 0;
}
}
您可以将此比较器与Collections.max
函数一起使用:
Collections.max(list, new VarsionComparator());
答案 3 :(得分:1)
您可以将max
的版本与指定的比较器一起使用:
System.out.println(Collections.max(list, new Comparator<String>() {
public int compare(String s1, String s2)
{
StringTokenizer st1 = new StringTokenizer(s1,".");
StringTokenizer st2 = new StringTokenizer(s2,".");
int res = 0;
String t1, t2;
while(st1.hasMoreTokens() && st2.hasMoreTokens())
{
t1 = st1.nextToken();
t2 = st2.nextToken();
res = Integer.valueOf(t1).compareTo(Integer.valueOf(t2));
}
if(res == 0)
{
res = st1.hasMoreTokens() ? 1 : (st2.hasMoreTokens() ? -1 : 0);
}
return res;
}
public boolean equals(Object obj) { return false; }
}));
答案 4 :(得分:0)
这将给你1.9,因为它不会将第二个数字视为10,它将首先视为1然后再将其视为9
修改强>
如果你想手动完成,那么</ p>