#java #collections
#java #Коллекции
Вопрос:
Предположим, у меня есть:
String[] superArray = new String[] { "a", "b", "c", "d", "e"};
String[] subArray = new String[] { "b", "e"};
Вопрос: Какой элегантный способ получить индекс в superArray
для каждого элемента subArray
?
Например, я хочу получить [1, 4]
результат.
Обновлено: [2-й (связанный) вопрос]
Как скопировать массив по индексам? Пример
String[] array = new String[] { "a", "b", "c", "d", "e"};
Integer[] indexes = new Integer[] { 1, 4 };
copyArrayByIndexes(array, indexes); // returns {"b", "e"}
Комментарии:
1. Наборы не имеют индекса. Элементы неупорядочены. Возможно, Set не является подходящим инструментом для работы. Чего именно вы хотите достичь?
2. @tobias_k извините, на самом деле я хочу сделать это для двух массивов
3. Теперь это имеет больше смысла. Ну, тогда что ты пробовал?
4. @tobias_k выполните итерацию по всему массиву и проверьте индекс каждого элемента. Другими словами, заново изобрести велосипед
5. Вам нужны результирующие индексы в новом массиве или просто индексы?
Ответ №1:
Вместо этого вы можете использовать упорядоченный список
List<String> superSet = Arrays.asList("a,b,c,d,e".split(","));
List<String> subSet = Arrays.asList("b", "e");
superSet.containsAll(subSet);
List<Integer> indexes = subSet.stream().forEach(superSet::indexOf)
.collect(Collectors.toList());
или
String[] array = { "a", "b", "c", "d", "e"};
int[] indexes = new int[] { 1, 4 };
List<String> lookup = Arrays.stream(indexes).forEach(i -> array[i])
.collect(Collectors.toList());
Комментарии:
1. @V_B в этом случае вы могли бы сделать то же самое, но с циклами, или вы могли бы упомянуть о необходимости Java 7 в вашем вопросе. 😉
Ответ №2:
Вы должны сделать себе одолжение и использовать списки вместо массивов. Вы можете легко преобразовать одно в другое с помощью java.utils.Arrays
. В списках просто намного больше вспомогательных методов, они имеют правильно реализованные equals
методы, могут расширяться по мере необходимости и т.д.
Используя списки, вы можете затем реализовать свои две функции следующим образом:
public static <T> List<Integer> getIndices(List<T> list, List<T> sublist) {
List<Integer> result = new ArrayList<Integer>();
for (T t : sublist) {
result.add(list.indexOf(t));
}
return resu<
}
public static <T> List<T> copyByIndices(List<T> list, List<Integer> indices) {
List<T> result = new ArrayList<T>();
for (Integer i : indices) {
result.add(list.get(i));
}
return resu<
}
Использование:
List<String> superArray = Arrays.asList("a", "b", "c", "d", "e");
List<String> subArray = Arrays.asList("b", "e");
List<Integer> indices = getIndices(superArray, subArray);
List<String> copy = copyByIndices(superArray, indices);
System.out.println(indices); // -> [1, 4]
System.out.println(copy); // -> [b, e]
System.out.println(subArray.equals(copy)); // -> true