2015-11-11 3 views
-2
public class Ship 
{ 
    private int shipId; 
    private int position; 
} 

public class MessageOfShip{ 
    private List<Ship> ships=new ArrayList<Ship>(); 
} 

Список судов является:Как получить последний индекс определенного элемента в списке?

[shipID: 1 position: 10] 
[shipID: 1 position: 20] 
[shipID: 2 position: 10] 
[shipID: 1 position: 30] 
[shipID: 2 position: 20] 

Как я могу получить последний добавленный элемент в списке конкретного shipId. Фокс пример последнего добавленного пункта shipId1 здесь [shipID: 1 position: 30]

+1

Вы пытались задуматься над этой проблемой? – Andremoniy

+4

итерации, получить его. –

ответ

2

Простая реализация должна была бы проверить на наличие какого-либо вхождения нужного элемента, а затем перебирать индексы нужного элемента, переписывая предыдущий индекс, если новый найден. Верните этот индекс в конце.

int desiredIndex = -1; 
for (int i = 0; i < ships.size(); i++) { 
    if (ships.get(i).equals("desiredStringToCheck") { //it may not necessarily be a string 
     desiredIndex = i; 
    } 
} 
return desiredIndex;  //-1 signifies that the string is not found 

Альтернативное решение (предложено Энди, спасибо!), Чтобы перебирать в обратном направлении и получить первое вхождение нужного элемента и возвращает это значение.

for (int i = (ships.size() - 1); i >= 0; i--) { 
    if (ships.get(i).equals("desiredStringToCheck") { //it may not necessarily be a string 
     return i; 
    } 
} 
return -1;  //If it doesn't return in the loop, meaning the string is not in the list 

Edited добавить проверки, если «desiredStringToCheck» не существует в списке (Спасибо Том!).

+0

Спасибо! Это будет сделано! – Claudiu

+0

Да, это класс. Поэтому ему нужно написать несколько геттеров. –

+3

Почему бы просто не повторить попытку назад и вернуться, как только вы обнаружите совпадение? –

0

Вы можете перебирать данных в обратном направлении с помощью ListIterator:

ListIterator<Ship> it = ships.listIterator(ships.size()); 
while (it.hasPrevious()) { 
    int index = it.previousIndex(); 
    Ship previous = it.previous(); 
    if (/* somehow compare previous to the thing you are looking for */) { 
    return index; 
    } 
} 

Альтернативный способ переопределить equals и hashCode в вашем Ship классе:

public class Ship 
{ 
    private int shipId; 
    private int position; 

    @Override public int hashCode() { 
    return Objects.hashCode(shipId, position); 
    } 

    @Override public boolean equals(Object other) { 
    if (other == this) { 
     return true; 
    } 
    if (other instanceof Ship) { 
     Ship o = (Ship) other; 
     return shipId == o.shipId && position == o.position; 
    } 
    return false; 
    } 
} 

Тогда просто использовать List.lastIndexOf:

ships.lastIndexOf(new Ship(1, 10)); 
Смежные вопросы