获取null作为整数类型的默认值

问题描述 投票:1回答:6

来自Leetcode Discussion的算法使用二进制搜索树来保存输入数组中的一系列值,以检查此数组是否包含最多不同于t的值,并且它们的索引最多彼此远离k。

JAVA:

public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
    if (nums == null || nums.length == 0 || k <= 0) {
        return false;
    }

    final TreeSet<Integer> values = new TreeSet<>();
    for (int ind = 0; ind < nums.length; ind++) {

        final Integer floor = values.floor(nums[ind] + t);
        final Integer ceil = values.ceiling(nums[ind] - t);

        if ((floor != null && floor >= nums[ind])
                || (ceil != null && ceil <= nums[ind])) {
            return true;
        }

        values.add(nums[ind]);
        if (ind >= k) {
            values.remove(nums[ind - k]);
        }
    }
    return false;
}

我正努力让它在C#中运行。只要LastOrDefaultFirstOrDefault方法返回0作为默认值,此代码就不起作用。如何解决null默认?

C#:

public bool ContainsNearbyAlmostDuplicate(int[] nums, int k, int t)
{
    if (nums == null || nums.Length < 2 || k < 1) return false;

    SortedSet<long> set = new SortedSet<long>();

    for (int i = 0; i < nums.Length; i++)
    {
        long l = (long)nums[i];

        long floor = set.LastOrDefault(n => n <= l);
        long ceil = set.FirstOrDefault(n => n >= l);

        if ((l - floor <= t) || (ceil - l <= t))
            return true;

        set.Add(l);
        if (i >= k) set.Remove((long)nums[i - k]);
    }
    return false;
}
c# .net binary-search-tree sortedset
6个回答
6
投票

一种方法是用可空的long声明你的集合

var set = new SortedSet<long?>();

或者您可以不使用FirstOrDefault并执行以下操作:

var greaterOrEqualToOne = set.Where(n => n >= 1);

long? ceil = greaterOrEqualToOne.Any() ? greaterOrEqualToOne.First() : null;

换句话说,首先将它们投射到long?

long? ceil = set.Select(n => (long?)n).FirstOrDefault(n => n >= 1);

4
投票

使用nullable long在LastOrDefault上获取null

SortedSet<long?> set = new SortedSet<long?>();

1
投票

如果要检索包含null的int / long / ...值,则需要使用Nullable Types

在您的源代码中将是:

 SortedSet<long?> set = new SortedSet<long?>();

1
投票

其他答案在技术上是正确的(在您的设置上使用可空类型)

SortedSet<long?> set = new SortedSet<long?>();

但是,为了从FirstOrDefault / LastOrDefault获得空值,您需要将int?[] nums传递给您的方法,因为您通过投射填充您的集合

long l = (long)nums[i];

即使在转换为可空的long?时,它也不会从int数组中获取null值。

换句话说 - 您的方法需要获取可空数组才能使用空值。

如果你不会在提供的数组上使用null,为什么不从i = 1迭代?


0
投票

如果要将int,long ...值声明为NULL,则需要声明如下:

int? empId;
if(empId is null)
{
    // do this
}
else
{
    //do this
}

以同样的方式使用:

SortedSet<long?> sortedSet = new SortedSet<long?>();

0
投票

你可以像其他用户所说的那样将int / long转换为可空类型(?),然后使用DefaultIfEmpty创建一个默认集合,如果集合结果为空,则包含null。

SortedSet<long?> set = new SortedSet<long?>();

long? floor = set.Where(n => n <= l).DefaultIfEmpty().LastOrDefault();
long? ceil = set.Where(n => n >= l).DefaultIfEmpty().FirstOrDefault();
© www.soinside.com 2019 - 2024. All rights reserved.