Обнаружить ненулевую ссылку в массиве - PullRequest
0 голосов
/ 19 января 2011

Я только что задал аналогичный вопрос , но потом понял, что мне действительно нужно что-то еще. Поскольку на этот вопрос уже есть два ответа, я не хочу редактировать свой вопрос. Вот что мне действительно нужно:


Я хочу определить, содержит ли поддиапазон массива только нулевые ссылки . Как-то так:

public static <T> boolean nullReferencesOnly
(T[] array, int fromInclusive, int toExclusive)
{
    for (int i = fromInclusive; i < toExclusive; ++i)
    {
        if (array[i] != null) return false;
    }
    return true;
}

Есть ли такой метод в библиотеке Java, поэтому мне не нужно вручную зацикливаться на массиве?

Ответы [ 4 ]

7 голосов
/ 19 января 2011
Collections.frequency(Arrays.asList(array), null) == array.length

Для диапазона SLaks уже предложил .subList(from, to) в своем ответе.

1 голос
/ 19 января 2011

Я думаю, что лучшее решение - взять уже полученный код, изменить тип массива на Object[] и поместить метод в класс "helper".

  1. AFAIK, в стандартных библиотеках Java нет метода, который бы делал то, что вы хотите напрямую.
  2. AFAIK, в Apache Commons или Google Collections / Guava нет метода, который бы делал то, что вы хотите напрямую.
  3. Решения, включающие Collection.contains, потерпят неудачу, потому что этот метод основан на equals и даст NPE, если вы протестируете на null.
  4. Решения, включающие общие frequency методы, не закорачиваются при обнаружении null.
  5. Решения, включающие применение Predicate объектов, дороги и требуют больше кода, чем ваше решение.

Ваше решение легко читается и более эффективно, чем любая из предложенных альтернатив. Тот факт, что он включает в себя явный цикл, не должен касаться вас. В конце концов, это код Java, который вы пишете ... а не язык FP.


В сторону - если бы проблема заключалась в том, чтобы проверить наличие элемента null (а не элемента null), тогда одной альтернативой будет org.springframework.util.Assert.noNullElements.

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/Assert.html#noNullElements(java.lang.Object[]))

Однако это вызывает исключение, а не возвращает true или false, и это может сделать его плохим решением ... если только вы не намеревались вызвать исключение в любом случае.

1 голос
/ 19 января 2011

Вы можете использовать функциональную библиотеку программирования, такую ​​как Guava (http://code.google.com/p/guava-libraries/). Вы можете сделать что-то вроде этого:


import com.google.common.base.Predicate;

public class NotNull implements Predicate
{

    @Override
    public boolean apply(String arg0)
    {
        return arg0 != null;
    }

}

И тестовый драйвер, чтобы увидеть, как он используется:


import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

import com.google.common.collect.Iterables;

public class Driver
{
    @Test
    public void testNotNull()
    {
        List l = Arrays.asList(new String[] {null, null, null});

        String s = Iterables.find(l, new NotNull(), null);

        assertNull(s);
    }

    @Test
    public void testNotNull2()
    {
        List l = Arrays.asList(new String[] {null, "1", null});

        String s = Iterables.find(l, new NotNull(), null);

        assertNotNull(s);
    }
}

С этим вы просто вызываете Iterables.find () и смотрите, может ли он найти что-нибудь, что не является нулевым. Пока он ничего не возвращает (ноль), вы знаете, что в списке не было ничего, что не было бы нулевым.

0 голосов
/ 19 января 2011

Ну, не совсем эффективно, но вы можете использовать Set, чтобы выручить, как в этом примере:

  String[] test = {null, null, null, null};
  Set<String> set = new HashSet<String>(Arrays.asList(test));
  System.out.println(set.size() == 0 || (set.size() == 1 && set.contains(null)));

Таким образом, если оно все равно NULL, у него будет только один элемент, и этоодин элемент будет нулевым.Если вам нужен только диапазон, вы можете использовать subList для Arrays.asList(test).

Неэффективно, но использует классы, которые можно найти в базовой библиотеке Java.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...