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