4

我有一个大的浮点(原始)数组,并不是数组中的每个元素都被填充。我如何将特定元素标记为 EMPTY。我知道这可以通过一些特殊符号来实现,但我仍然想知道标准方式。即使我使用一些特殊符号,我将如何处理实际数据项是特殊符号值的情况。简而言之,我的问题是如何在 java 的原始类型数组中实现 NULL 功能。

PS - 我不使用 Float 对象的原因是为了实现高内存和速度性能。

谢谢 Vineeth

4

6 回答 6

5

您可以使用Float.NaN, 任何有效值都不会是那样。

请注意,一个NaN永远不等于另一个 NaN,因此您可以NaN通过以下方式检查某些内容:

float a = Float.NaN;
if( a != a ) {
    System.out.println("wat?");
}

在供人们阅读的代码中,您应该使用Float.isNaN方法。

于 2012-11-28T16:59:51.507 回答
3

你可以使用 Float.NaN 吗?

public class FloatArray {
    public static void main(String[] args) {
        float[] data = new float[10];
        data[5] = Float.NaN;
        for (float f : data){
            if (Float.isNaN(f)){
                System.out.println("No Valve");
            } else {
                System.out.println(f);
            }
        }
    }
}

那么使用像 -1 这样可能有效的Sentianl 值的风险在哪里,您可以使用 Float#isNaN(f) 进行测试

于 2012-11-28T17:00:43.737 回答
1

一种选择是使用像Float.MAX_VALUE.

另一个是实际上有一个数组Float而不是数组float,这将允许您拥有null值。

于 2012-11-28T16:59:09.943 回答
1

我倾向于为此使用Float.NaN(不是数字)。

Float.MAX_VALUEet al 不同,当您对阵列进行数学运算时,您不必专门检查它们。NaNs 将保持 NaNs,而MAX_VALUEet al 可能需要使用条件逻辑来处理。

唯一要记住的是,NaN 不等于任何东西,包括它们自己。

于 2012-11-28T17:00:33.080 回答
0

有一种方法可以在 float[] 中使用正常的浮点数、无穷大、NaN 和空标记。Float 具有二进制表示(参见 IEEE-754),您可以使用 Float.floatToIntBits(float) 来查看它。NaN“规范”(参见 Float API)二进制表示为 0x7fc00000。有趣的是,NaN 有许多二进制表示,它们都是有效的,例如 0x7ff00000 也是一个 NaN。试试这个

    int nan1 = 0x7ff00000;
    int nan2 = 0x7fc00000;
    float f1 = Float.intBitsToFloat(nan1);
    float f2 = Float.intBitsToFloat(nan2);
    System.out.println(Float.isNaN(f1));
    System.out.println(Float.isNaN(f2));

你会看到 f1 和 f2 都是 NaN。

因此,您可以使用任何非规范的 NaN,例如 0x7ff00000,作为空标记。确保在将浮点数写入数组时,将 NaN 转换为规范形式。例如

    f = (f != f) ? f = Float.NaN : f;

请注意,f != f 是测试浮点数是否为 NaN 的最快方法。

检查浮点数是否为空标记

    isEmptyMark = f != f && Float.floatToRawIntBits(f) == 0x7ff00000;
于 2012-11-28T17:38:37.183 回答
-1

这是原语的主要问题之一。值的范围null无法有意义地表示。
我建议您去,Float否则您将不得不定义特定的值范围及其含义。
示例:如果您-1.0在您的域中不是一个有意义的数字,您可以使用它来表示null.
但我强烈建议切换到对象而不是原语。

我不使用 Float 对象的原因是为了实现高内存和速度性能。

除非您正在做一些非常繁重的数字运算,装箱/自动装箱不会导致任何性能问题。
与往常一样,进行测量,如果您发现确实存在性能问题,那么您可以放弃Float使用 prematives。
不要过早优化

于 2012-11-28T16:59:18.443 回答