Хорошее и чистое управляемое решение от 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".
Надеюсь, это поможет кому-то искать такое решение в будущем.
Некоторое дальнейшее объяснение. Метод 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...);
Вопрос задает два отдельных вопроса: преобразование 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));
Другим вариантом будет использование набора примитивов из 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