从哈希集<Double>中提取整数



我有一个HashSet<Double>,我想从中提取整数元素,即小数后全为零的元素。有标准的方法吗?我可以做一些迂回的事情,例如:给定一个双x,我可以查看小数点后的所有值,看看它们是否都为零,但这似乎很复杂。

您可以将它们强制转换为整数,并将强制转换的值与原始相等

double d = 1.5;
if((int)d==d) // integer
else // not integer

我想你喜欢整数的最终结果,而不是双的结果。例如,7而不是7.0。

所以试试这个:

Set<Double> set = new HashSet<>();
set.add(6.4);
set.add(10.44);
set.add(7.0);
Set<Integer> filtered = set.stream()
.filter(item -> Math.floor(item) == item)
.map(Double::intValue)
.collect(Collectors.toSet());
System.out.println(filtered);

您可以这样做:

HashSet<Double> hd = new HashSet<> ();
hd.add (3.5);
hd.add (2.0);
hd.add (3.444);
hd.add (-1.0);
Set<Double> filtered = hd.stream()
.filter (x -> (int)(double)x == x)
.collect (Collectors.toSet());
System.out.println (filtered);

输出:

[2.0, -1.0]

首先必须将Double强制转换为double,然后再将其强制转换为int。如果该int等于原始Double,则该Double保持整数值。

如果你想避免显式铸造,你可以更改

.filter (x -> (int)(double)x == x)

.filter (x -> x.intValue() == x)

它做了完全相同的事情。

试试这个:

Collection<Integer> filterIntegers( final HashSet<Double> doubles )
{
final var retValue = doubles.stream()
.filter( d -> d.doubleValue() == d.intValue() )
.map( Double::intValue )
.collect( Collector.toSet() );
return retValue;
}

在我看来,明确比较d的实(双(值及其整数值似乎是该需求的最精确实现。不需要转换,不需要数学运算(尽管所有这些都会提供相同的结果!(。

最新更新