从 HashSet<Double> 中提取整数

Extracting integers from a HashSet<Double>

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

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

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

你可以这样做:

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)

做完全相同的事情。

我猜你喜欢整数而不是双精度的最终结果。例如。 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);

试试这个:

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 的实数(双精度)值与其整数值在我看来是最精确的要求实现。没有转换,没有涉及数学运算(尽管所有这些都会提供相同的结果!)。