получить индекс в наборе для каждого элемента подмножества

#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