这是一个经典的最小和最大问题。无论您的对象是日期、字符串还是数字。重要的是它们具有可比性。
排序然后取最大值/最小值
最直接的方法就像其他人的答案一样,使用 java 内置的 Sort 方法对集合进行排序。然后将第一个和最后一个元素作为您的最小/最大对象。然而,它将线性时间O(n)
问题变成了O(nlgn)
. 好吧,如果性能问题不是您正在考虑的问题。你可以跳过阅读我的休息文本。我会赞成@Quoi 的回答。
线性时间的简单方法:
保留两个变量最小值和最大值,然后查找集合中的每个元素。与您当前的最小值和最大值进行比较并获得正确的值。直到结束。
线性时间的优化方式
上面的方法很简单,但它带来了更多的比较(2n)
。我们可以稍微优化一下。和上面一样,你有 min 和 max 两个变量。在循环中,您采用一对元素而不是单个元素。您首先比较该对中的两个元素。取较大的与您的最大变量进行比较,将较小的与您的最小变量进行比较。现在我们只需要进行3(n/2)
比较。
希望能帮助到你
编辑
我认为代码并不难写。正如 Quoi 所建议的,如果代码可以使答案完整,我会添加它们。
请注意,在示例中,我使用了一个 int 数组。基本上它与 Date 对象相同。代码以单元测试方法编写。它看起来很长,因为我试图清楚地解释上面的想法。
@Test
public void testx() {
final int size = 300000;
final int[] array = new int[size];
final Random random = new Random();
// fill a huge array for testing
for (int i = 0; i < array.length; i++) {
array[i] = random.nextInt();
}
int min1 = array[0], max1 = array[1], cmp1 = 0;
int min2 = array[0], max2 = array[1], cmp2 = 0;
for (int i = 2; i < array.length; i++) {
min1 = array[i] < min1 ? array[i] : min1;
cmp1++;
max1 = array[i] > max1 ? array[i] : max1;
cmp1++;
}
LOG.debug("linear time to find Max & Min simultaneously");
LOG.debug("Size: {}", size);
LOG.debug("Max : {}", max1);
LOG.debug("Min : {}", min1);
LOG.debug("Total comparisons : {}", cmp1);
// optimized linear
int bigger, smaller;
final boolean odd = array.length % 2 == 1;
final int till = odd ? array.length - 1 : array.length;
for (int i = 2; i < till; i += 2) {
if (array[i] >= array[i + 1]) {
bigger = array[i];
smaller = array[i + 1];
} else {
bigger = array[i + 1];
smaller = array[i];
}
cmp2++;
min2 = smaller < min2 ? smaller : min2;
cmp2++;
max2 = bigger > max2 ? bigger : max2;
cmp2++;
}
if (odd) {
min2 = array[size - 1] < min2 ? array[size - 1] : min2;
max2 = array[size - 1] > max2 ? array[size - 1] : max2;
}
LOG.debug("====================================================");
LOG.debug("optimized linear time to find Max & Min simultaneously");
LOG.debug("Size: {}", size);
LOG.debug("Max : {}", max2);
LOG.debug("Min : {}", min2);
LOG.debug("Total comparisons : {}", cmp2);
}
输出
DEBUG: linear time to find Max & Min simultaneously
DEBUG: Size: 300000
DEBUG: Max : 2147475519
DEBUG: Min : -2147446732
DEBUG: Total comparisons : 599996
DEBUG: ====================================================
DEBUG: optimized linear time to find Max & Min simultaneously
DEBUG: Size: 300000
DEBUG: Max : 2147475519
DEBUG: Min : -2147446732
DEBUG: Total comparisons : 449997