2015-07-13 3 views
-1

У меня есть ArrayList, который мне нужно сортировать, но мне нужно также получить индексы отсортированных элементов. ArrayList часто имеет много повторяющихся значений, поскольку он обновляется, и indexex, который я получаю, дублируется. Мне нужны уникальные индексы. Есть ли способ получить эти индексы?Как получить уникальные индексы отсортированного Java ArrayList?

indices = new int[depth.size()]; 
ArrayList<Float> fStore = new ArrayList(depth); 
Collections.sort(depth); 
for (int n=0; n<depth.size(); n++){  
    indices[n] = fStore.indexOf(depth.get(n));  
} 
+0

1. Вы не показываете свои объекты; 2. в Java нет такой вещи, как «индекс». Пожалуйста, покажите код. – fge

+2

@fge "2. нет такой вещи, как« индекс »в Java» - ???? – brso05

+0

Отправьте примерный список, какой результат вы хотите получить, и то, что вы уже пробовали. – khelwood

ответ

0

Проблема с indexOf() является то, что она возвращает индекс первого вхождения элемента в списке, или -1, если нет. Если в вашем списке есть дубликаты, то для этих дубликатов вы получите индекс их первого появления в списке.

Есть много способов добиться того, чего вы хотите. Одним из них является использование SortedSet и помощник IndexedEntry класса:

public class IndexedEntry<T extends Comparable<T>> 
    implements Comparable<IndexedEntry<T>> { 

    private final Integer index; 

    private final T entry; 

    public IndexedEntry(Integer index, T entry) { 
     this.index = index; 
     this.entry = entry; 
    } 

    public Integer getIndex() { 
     return this.index; 
    } 

    public T getEntry() { 
     return this.entry; 
    } 

    @Override 
    public int compareTo(IndexedEntry<T> other) { 
     int byEntry = this.getEntry().compareTo(other.getEntry()); 
     if (byEntry == 0) { 
      return this.getIndex().compareTo(other.getIndex()); 
     } 
     return byEntry; 
    } 

    @Override 
    public String toString() { 
     return "(" + this.entry + ", " + this.index + ")"; 
    } 
} 

IndexedEntry класса просто обертывает значение Comparable и его индекс, и реализует Comparable сначала сравнивает значение, и если значение равно, то он сравнивает индекс. Это означает, что упорядоченный список IndexedEntry будет иметь свои элементы, упорядоченные по (value, index).

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

List<Float> unordered = new ArrayList<>(Arrays.asList(3.2f, 1.0f, 7.5f, 3.2f, 0.8f)); 
    System.out.println(unordered); // [3.2, 1.0, 7.5, 3.2, 0.8] 

    List<IndexedEntry<Float>> ordered = new ArrayList<>(); 
    for (int i = 0; i < unordered.size(); i++) { 
     IndexedEntry<Float> entry = new IndexedEntry<>(i, unordered.get(i)); 
     ordered.add(entry); 
    } 
    Collections.sort(ordered); 
    System.out.println(ordered); // [(0.8, 4), (1.0, 1), (3.2, 0), (3.2, 3), (7.5, 2)] 

После сортировки, то ordered список будет содержать элементы вместе с исходным индексом.

Смежные вопросы