2016-09-09 3 views
0

У меня есть этот класс с несколькими атрибутами что-то вроде этого:Получить индекс массива с известным значением структуры

public class FileIn { 

public String id; 

public void setID(String id_) { 
    id = id_; 
} 

public String getID() { 
    return id; 
} 

... 

} 

Есть 20 атрибутов. Тогда я положил эти данные в одном ArrayList:

public ArrayList<FileIn> dfor_A = new ArrayList<FileIn>(); 

Ну, потом я должен получить индекс одного элемента, но я знаю, идентификатор

dfor_A.get(-unknow index-).getID(); 

Как искать и получить индекс ?

ответ

0

Решение 1: Я думаю, вы должны цикла

/*function perform operation dfor_A.indexOf(item.id);*/ 
public int getIndexOf(String id,List dfor_A) 
{ 
    for (int i = 0; i < dfor_A.size(); i++) { 

    FileIn fi = dfor_A.get (i); 
    if (fi.getID().equals (id)) { 
     return i; // this is the index 
    } 
    } 

    return -1; 
} 

Решение 2: Если вы думаете о хорошем его исполнении. Я предлагаю вам использовать расширенные функции

Шаг 1: Реализация Компаратор

public class FileInCustomComparator implements Comparator<FileIn> { 
    @Override 
    public int compare(FileIn fileIn1, FileIn fileIn2) { 
     return fileIn1.getId()-fileIn2.getId();//id consider as int here 
    } 
} 

Шаг 2: Сортировка списка

Collections.sort(for_A /*list here*/, new FileInCustomComparator()); 

Шаг 3: Поиск отсортированного списка с использованием оптимизированного встроенный алгоритм

public void search(String key,List list) { 
    System.out.println("\nSearching for " + key); 

    int result = Collections.binarySearch(list, key); 
    if (result >= 0) 
    System.out.print(" Found at index " + result); 
    else 
    System.out.print(" Not found [" + result + "]"); 
} 
+0

Выглядит очень медленно для множества предметов. Также, как вы уже зацикливаете, сыворотка не просто держит «счетчик» для индекса? Поиск «indexOf» элемента, когда вы его уже нашли, замедлит работу еще больше. –

+0

Да, петля - последний ресурс, это будет работать более 5000 предметов, а для получения всего 1 значения слишком много траты времени –

+0

Я пробовал это сначала, но данные, которые он меняет с течением времени и его заказом, не являются чем-то я могу контролировать, поэтому, если элемент получил индекс x в первом запуске через 3 или 4 часа, он изменяется, поэтому это не опция. –

0

Используйте карту, например. HashMap

Map <String, FileIn> map = new HashMap <>(); 
map.put (fileIn.getID(), fileIn); 

позже

FileIn fileIn = map.get (fileIn.getID()); 

Если вы действительно хотите сохранить ArrayList, то вам нужно в цикле

for (int i = 0; i < dfor_A.length; i++) { 

    FileIn fi = dfor_A.get (i); 
    if (fi.getID().equals (id)) { 
     return i; // this is the index 
    } 
} 
+0

Я попробую это, спасибо –

+0

Если это сработает, подумайте о повышении и/или принятии моего ответа –

+0

Да, я повышаю, но, к сожалению, это не работает. Я должен это выяснить –

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