Массив Java int [] для HashSet < Integer >

Хорошее и чистое управляемое решение от Earwicker не справилось с такими аргументами:

Test("\"He whispered to her \\\"I love you\\\".\"", "He whispered to her \"I love you\".");

Он вернул 3 элемента:

"He whispered to her \"I
love
you\"."

Итак, вот исправление, которое поддерживает «цитируемый» escape \ quot quote:

public static IEnumerable SplitCommandLine(string commandLine)
{
    bool inQuotes = false;
    bool isEscaping = false;

    return commandLine.Split(c => {
        if (c == '\\' && !isEscaping) { isEscaping = true; return false; }

        if (c == '\"' && !isEscaping)
            inQuotes = !inQuotes;

        isEscaping = false;

        return !inQuotes && Char.IsWhiteSpace(c)/*c == ' '*/;
        })
        .Select(arg => arg.Trim().TrimMatchingQuotes('\"').Replace("\\\"", "\""))
        .Where(arg => !string.IsNullOrEmpty(arg));
}

Протестировано с двумя дополнительными случаями:

Test("\"C:\\Program Files\"", "C:\\Program Files");
Test("\"He whispered to her \\\"I love you\\\".\"", "He whispered to her \"I love you\".");

Также отметил, что принятый ответ на Atif Aziz , который использует CommandLineToArgvW , также потерпел неудачу. Он возвратил 4 элемента:

He whispered to her \ 
I 
love 
you". 

Надеюсь, это поможет кому-то искать такое решение в будущем.

24
задан Robottinosino 19 August 2012 в 23:09
поделиться

3 ответа

Некоторое дальнейшее объяснение. Метод asList имеет эту подпись

public static <T> List<T> asList(T... a)

Так что если вы сделаете это:

List<Integer> list = Arrays.asList(1, 2, 3, 4)

или это:

List<Integer> list = Arrays.asList(new Integer[] { 1, 2, 3, 4 })

В этих случаях я считаю, что Java является в состоянии сделать вывод, что вы хотите вернуть список обратно, поэтому он заполняет параметр типа, что означает, что он ожидает целочисленные параметры для вызова метода. Так как он может автоматически переносить значения из int в Integer, это нормально.

Тем не менее, это не сработает

List<Integer> list = Arrays.asList(new int[] { 1, 2, 3, 4} )

, поскольку примитив к приведению обертки (т. Е. Int [] к Integer []) не встроен в язык (не уверен, почему они этого не сделали , но они этого не сделали.

В результате каждый примитивный тип должен обрабатываться как собственный перегруженный метод, что и делает пакет commons. то есть.

public static List<Integer> asList(int i...);
13
ответ дан Matt 19 August 2012 в 23:09
поделиться

Вопрос задает два отдельных вопроса: преобразование int[] в Integer[] и создание HashSet<Integer> из int[]. Оба легко сделать с потоками Java 8:

int[] array = ...
Integer[] boxedArray = IntStream.of(array).boxed().toArray(Integer[]::new);
Set<Integer> set = IntStream.of(array).boxed().collect(Collectors.toSet());
//or if you need a HashSet specifically
HashSet<Integer> hashset = IntStream.of(array).boxed()
    .collect(Collectors.toCollection(HashSet::new));
5
ответ дан Jeffrey Bosboom 19 August 2012 в 23:09
поделиться

Другим вариантом будет использование набора примитивов из Eclipse Collections . Вы можете легко преобразовать int[] в MutableIntSet в Set<Integer> или Integer[], как показано ниже, или вы можете использовать MutableIntSet как есть, что будет намного более эффективным в использовании и производительностью памяти.

int[] a = {1, 2, 3};
MutableIntSet intSet = IntSets.mutable.with(a);
Set<Integer> integerSet = intSet.collect(i -> i);  // auto-boxing
Integer[] integerArray = integerSet.toArray(new Integer[]{});

Если вы хотите перейти непосредственно из массива int в массив Integer и сохранить порядок, то это сработает.

Integer[] integers = 
        IntLists.mutable.with(a).collect(i -> i).toArray(new Integer[]{});

Примечание: я являюсь коммиттером для Eclipse Collections

1
ответ дан Donald Raab 19 August 2012 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: