2014-02-17 3 views
2

Представьте, что у нас есть два списка и вы хотите знать посты элементов из одного списка в другом. Для иллюстрации:Элементы карты в списке позиций в другом списке

List<String> one = Arrays.asList("B", "I", "G"); 
List<String> another = Arrays.asList("L", "A", "R", "G", "E"); 

Результат будет выглядеть так:

[-1, -1, 3] 

, потому что ни B, ни я не происходит во втором списке, но G делает на 3-й позиции.

Это то, что я пришел с до сих пор:

<E> List<Integer> indices(List<E> elements, List<E> container) { 
    List<Integer> indices = new ArrayList<>(elements.size()); 
    for (int i = 0; i < elements.size(); i++) { 
     indices.add(container.indexOf(indices.get(i))); 
    } 
    return indices; 
} 

Есть ли быстрее решение, которое позволяет избежать внутреннего цикла в List.indexOf()?

+0

@Sneaky Я уверен, что динамическое программирование подход может улучшить его от п * м к оценке, которая может приближаться к п + т, по предварительной обработке каждого массива в последовательности и слиянии как в общую структуру данных которые могут быть проверены на предмет перекрытия. – chrylis

ответ

4

Вы можете использовать Map:

Map<String, Integer> otherMap = new HashMap<>(other.size()); 
int index = 0; 
for(String otherElem : other) { 
    otherMap.put(otherElem, index++); 
} 

А потом:

for(String oneElem : one) { 
    Integer index = otherMap.get(oneElem); 
    indices.add(index == null ? -1 : index); 
} 

Делая это, вы получите индекс напрямую, а не перебор на потенциально очень большой список каждый раз, когда вы смотрите на и индекс ,

+0

Да, пришел к той же самой идее только сейчас :-) Ваш код лучше, чем мой, я буду использовать ваш, если вы не против. – hoefling

+0

Я абсолютно не против. Я надеюсь, что это помогает :) –

2

Вы можете использовать HashMap<String, Integer>, который отобразит каждого персонажа в его положение. Затем используйте метод HashMap.containsKey(), чтобы узнать, существует ли определенная строка в поле и .get(), чтобы узнать позицию.

HashMap<String, Integer> another; 

for (String str : one) { 

    if (another.contains(str)) { 
     result.add(another.get(str)); 
    } else { 
     result.add(-1); 
    } 
} 
Смежные вопросы