这是一个经典的最小值和最大值问题。无论您的对象是日期、字符串或数字,重要的是它们是可比较的。
先排序再取最大/最小值
最直接的方法就像其他答案中提到的一样,使用Java内置的排序方法对集合进行排序。然后将第一个和最后一个元素作为您的最小/最大对象。不过这会将一个线性时间复杂度O(n)
问题变成O(nlgn)
。如果性能并不重要,您可以跳过阅读我的其余文本。我将为@Quoi的答案点赞。
线性时间复杂度的简单方法:
保持两个变量min和max,然后遍历您的集合中的每个元素。与当前的min和max进行比较,并获取正确的值,直到结束。
线性时间复杂度的优化方式
上面的方法很容易,但它带来了更多的比较(2n)
。我们可以稍微优化一下。同样是min和max两个变量,在循环中,您需要取一对元素而不是单个元素。首先比较一对元素,将较大的元素与您的max变量进行比较,将较小的元素与您的min变量进行比较。现在我们只需要做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();
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);
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