2010-06-07 6 views
2

Java 스택이 생성되었으며 일부 맞춤 개체가 추가되었습니다. 이 객체는 자신의 필드 중 하나로 고유 ID를 포함합니다. 고유 이름을 기반으로 스택에 해당 개체의 인덱스를 가져와야합니다. 예제를 찾으십시오.스택에서 검색

class TestVO{ 

private String name; 
private String uniqueId; 
//getters and setters 
} 
public class TestStack{ 
public static void main(String args[]){ 
    TestVO vo1=new TestVO(); 
TestVO vo2=new TestVO(); 
TestVO vo3=new TestVO(); 

vo1.setName("Test Name 1") 
vo1.setId("123") 

vo2.setName("Test name 2"); 
vo2.setId("234"); 

Stack<TestVO> stack=new Stack<TestVO>(); 
stack.add(vo1); 
stack.add(vo2); 

//I need to get the index of a VO from stack using it's unique ID 
} 

} 

누군가 구현할 수 있습니까?

+1

왜 스택을 사용해야합니까? 스택이 이에 적합하지 않습니다. 이 숙제가 있니? – strager

+1

탐색 경로 탐색을 구성해야합니다. 스택이 편리하다고 생각했습니다. – Apps

답변

4

첫째, 해시 코드를 구현하고 TestVO 클래스의 방법과 같다 :

class TestVO{ 

private String name; 
private String uniqueId; 

public boolean hashCode() { 
    if (uniqueId == null) return 0; 
    return uniqueId.hashCode(); 
} 

public boolean equals(Object o) { 
    if (o instanceof TestVO) { 
    TestVO other = (TestVO) o; 
    return o.uniqueId.equals(uniqueId); 
    } 
    return false; 
} 
//getters and setters 
} 

가 있다는 점 유의 하시길 바랍니다 equals 메소드에 당신은 o.uniqueId가 null가 아닌 것을 확인하기 위해 추가 코드를 추가해야합니다. 이제

당신은 그것의 UNIQUEID이 코드를 사용하여 사용하여 TestVO 객체의 인덱스를 찾을 수 있습니다 당신은 아마에 조치를 취해야한다, 당신은 uniqueId 필드 평등의 당신의 개념을 기반으로하기 위하여려고하는 경우에

int index = stack.indexOf(vo1); 
+0

+1'instanceof' 연산자는'null'에'false'를 반환하므로 명시적인 검사는 필요 없습니다 : http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20. 2 – trashgod

+0

그러나 o.uniqueId는 여전히 null 일 수 있습니다. – Behrang

+0

@Stephen C의 대답은이를 효과적으로 처리합니다. – trashgod

2

Stacksearch 메서드를 사용할 수 있습니다. 스택 상단에서 해당 객체까지의 거리를 반환합니다. 바라기를 충분하다. equals 메서드를 정의해야합니다.이 방법은 매우 간단합니다. id 필드를 비교하면됩니다.

Java API Documentation

+0

대니얼 (Daniel) 대단히 감사합니다. VO에 대한 오버라이드 equals 메소드가 최선의 방법이라고 알려 주시겠습니까? VO 코드를 수정하지 않고이를 달성 할 수있는 방법이 있습니까? – Apps

+0

그 클래스를 변경할 수 없다면 가장 좋은 대안은 하위 클래스를 만들고 equals 메서드를 재정의하는 것입니다. 그런 다음 스택에 밀어 넣을 때 새 서브 클래스로 캐스팅합니다 (실제로 작동한다고 생각합니다. 직접 해보십시오). 즉, 객체를 만들 때 새 클래스를 사용하십시오. –

+0

@WPS :'search()는'equals()'를 사용합니다. @ 대니얼 : +1 최근 링크를 인용 해보십시오. – trashgod

2

을 필드가 제대로 초기화되었는지, 그리고 초기화 된 후에는 변경되지 않는지 확인하십시오.

필드에 제한없는 설정자를 제공하면 TestVO 객체를 세트 또는 맵에 삽입 한 후 일부 코드가 필드를 변경하면 모든 종류의 깨진 동작이 발생합니다.

관련 문제