我将对象集合为Collection basics = periodic.getGeneratedBasic();
迭代这个集合并获取每个对象并进行投射时,我可以提取每个对象的日期。
现在,在这一点上,我想查看这个对象集合中哪一个是小而且最大的日期。
有人知道该怎么做吗?
Date max;
Date min;
for(Object o:basics){
Basic b = (Basic) o;
Date temp;
if(b.State=='U'){
basicAList.add(ba);
dateCollection.add(b.firstDateTime);
temp= ;
if(b.firstDateTime <)
}
}
答案 0 :(得分:15)
在Java 8中,你可以这样做:
final Date maxDate = dates.stream()
.max(Date::compareTo)
.get();
答案 1 :(得分:13)
这是一个经典的最小值&amp;最大问题。无论您的对象是日期或字符串,还是数字。重要的是它们具有可比性。
排序然后采取最大/最小
最简单的方法就像其他人的答案一样,使用java内置Sort方法对集合进行排序。然后将第一个和最后一个元素作为最小/最大对象。但是,它将线性时间O(n)
问题转换为O(nlgn)
。如果性能问题不是你正在考虑的问题。你可以跳过阅读我的休息文本。我将赞成@ Quoi的回答。
线性时间的简便方法:
保持两个变量min和max,然后选择集合中的每个元素。与您当前的最小值和最大值进行比较并获得正确的值。直至最后。
线性时间的优化方式
上述方法很简单,但它带来了更多的比较(2n)
。我们可以稍微优化一下。与上面相同,你有最小和最大两个变量。在循环中,你采用一对元素而不是单个元素。首先比较一对中的两个元素。把较大的一个与你的max var进行比较,将较小的一个与你的min var进行比较。现在我们只需进行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
答案 2 :(得分:12)
为什么不使用Collections.sort()然后选择第一个/最后一个条目?您可以使用自然订购,也可以指定自己的Comparator。
请注意,这将对集合就地进行排序。它不会给你一个新的排序集合。
答案 3 :(得分:7)
Date
为Comparable
,因此您可以使用compareTo()
比较两个Date
:
dateOne.compareTo(dateTwo);
<强>返回强>: 如果参数Date等于此Date,则值为0;如果此Date在Date参数之前,则小于0的值;如果此Date在Date参数之后,则值大于0.
您还可以使用Collections.sort()
(O(n logn))对整个Collection
进行排序:
Collections.sort(dateCollection);
或者获得Collections.max()
的最大值和Collections.min()
的最小值(均为线性时间O(n))。
答案 4 :(得分:2)
Date max = new Date(0);
Date min = new Date(0);
for(Object o:basics){
Basic b = (Basic) o;
if(b.State=='U'){
basicAList.add(ba);
dateCollection.add(b.firstDateTime);
if(min.compareTo(b.firstDateTime) > 0) min = b.firstDateTime;
else if(max.compareTo(b.firstDateTime) < 0) max = b.firstDateTime;
}
}
答案 5 :(得分:1)
您可以根据日期对收藏品进行排序并获取。如果升序,您将获得最小的日期和最后的最后日期,如果您按降序排序,那么您将在最高和最小日期获得最大日期。
答案 6 :(得分:1)
您可以查看以前的this SO帖子。您可以按日期对对象进行排序,然后选择集合中的第一个和最后一个项目。