2010-11-18 3 views
5

Java에서 Map 및 List 인터페이스를 모두 구현하는 객체를 갖고 싶습니다. 아이디어는이 문제의 문제와 유사하다 : Java Ordered Map 나는 목록에 이름/값 쌍을 추가하고 목록의 순서를 유지해야뿐만 아니라, 이름으로 조회를 할 수 있도록하려면Java에서 Map 및 List 인터페이스를 모두 구현 하시겠습니까?

:

foo.put("name0", "value0"); 
foo.put("name1", "value1"); 
foo.get(1); --> Map.Entry("name1", "value1") 
foo.get("name0"); --> "value0" 

여기에 문제의 :이 클래스를 만들 때 :

"The return type is incompatible with Map.remove(Object)" 
public boolean remove(Object o) { 
    return false; 
} 
:

class Foo implements Map, List { 
    // add all methods here 
} 

을 내가 컴파일 오류가

Map 및 List 인터페이스를 구현하지 않으면이 데이터 구조에서 사용할 수없는 많은 Java 콜렉션 메소드가 있습니다.

은 (또한, 자바에서 제안 된 솔루션이 작동하지 않습니다 위의지도를 주문하는 이유의 LinkedHashMap가.는 GET (int) 메소드가없는 인덱스 항목을 선택할 수 없다는 것입니다.)

+2

'LinkedHashMap'을 확장하는 것에 반대합니까, 그렇지 않다면'get (int)'메소드를 추가하지 않으시겠습니까? –

+0

http://www.java.net/forum/topic/jdk/java-se/implementing-both-map-and-list-impossible-0 – Adam

+1

@Adam 그 링크는 고장 났지만 우리는 그것은 단지 URL에서 말합니다;) – MatrixFrog

답변

5

같은 클래스에 ListMap을 모두 구현할 수는 없습니다. 그러나 당신이 필요로하는 것은 또한 필요하지 않아야합니다. 필요한 것은 dataMapList 인터페이스를 통해 액세스 할 수 있습니다. 마치 entrySet() 또는 Map.values()을 사용하는 컬렉션으로 설정된 Map 데이터에 액세스하는 것과 같은 비트. 당신이 필요로 한마디로

는 데이터에 둘 전망이다 구현 한 뷰 ListMap를 구현하는 또 다른보기.

하나의보기가 지배적 인 경우 (예 : Map)지도 구현에 데이터의 목록을 제공하고지도의 데이터로 백업되는 List getAsList() 메서드를 제공 할 수 있습니다.

편집

파울로 오 Guedes에 의해 주어진 대답은 서비스를 제공한다. 요구 사항이있는 Map 구현이 이미 있습니다. 내 대답은 좀 더 일반적이고, 간단한 어댑터만으로는 충분하지 않은 여러 호환되지 않는 인터페이스를 사용하여 동일한 데이터를 제공하는 것이 일반적입니다.

5

LinkedHashMap 네가 필요로하는 것을한다.

예측 가능한 반복 순서를 사용하여 Map 인터페이스의 해시 테이블 및 링크 된 목록 구현. 이 구현은 HashMap과 달리 모든 항목을 통해 실행되는 이중 연결 목록을 유지 관리합니다.

+0

인덱스로 항목을 가져 오는 get 메서드가 없습니다. – Adam

+2

@Adam : LinkedHashMap을 확장하고 반복기를 사용하여 get (int index)을 구현합니다. 'table'이라는 배킹 Entry [] 배열을 사용할 수도 있습니다 (견고성을 위해 iterator를 사용합니다). – extraneon

1

MapList 인터페이스에는 remove 메소드의 상충되는 정의가 들어 있습니다. 같은 메소드 시그니처를 리턴 유형의 차이만으로 대체 할 수 없기 때문에 단일 클래스에서 두 가지를 모두 구현할 수는 없습니다.

List<Map.Entry<K,V>>을 사용하면 귀하의 필요를 충족시킬 수 있을지 궁금합니다., 자바,

boolean remove(Object o) 

을 그리고 : List가 정의하는 동안

V remove(Object key) 

:

5

이 오류의 원인이 Map는 다음 remove 방법에 대한 정의가 포함되어 있음을 지적한다 메서드는 반환 형식에 따라 오버로드 할 수 없기 때문에 충돌하는 서명이며 동일한 클래스에서 구현할 수 없습니다.

2

왜 자신의 인터페이스를 구현하지 않습니까? 데이브 코스타 당신의 LinkedHashMap을 사용한다 말 이외에

public interface HashListMap { 

public boolean add(Object arg0); 
public void add(int arg0, Object arg1); 
public boolean addAll(Collection arg0); 
public boolean addAll(int arg0, Collection arg1); 
public void clear(); 
public boolean contains(Object arg0); 
public boolean containsAll(Collection arg0); 
public Object get(int arg0); 
public int indexOf(Object arg0); 
public boolean isEmpty(); 
public Iterator iterator(); 
public int lastIndexOf(Object arg0); 
public ListIterator listIterator(); 
public ListIterator listIterator(int arg0); 
public boolean remove(Object arg0); 
public Object remove(int arg0); 
public boolean removeAll(Collection arg0); 
public boolean retainAll(Collection arg0); 
public Object set(int arg0, Object arg1); 
public int size(); 
public List subList(int arg0, int arg1); 
public Object[] toArray(); 
public Object[] toArray(Object[] arg0); 
public boolean containsKey(Object arg0); 
public boolean containsValue(Object arg0); 
public Set entrySet(); 
public Object get(Object arg0); 
public Set keySet(); 
public Object put(Object arg0, Object arg1); 
public void putAll(Map arg0); 
public Collection values(); 

}

+2

+1 유머 감각에 대해 –

+0

매우 재미 있습니다 :) "지원되지 않는"인터페이스를 사용하는 이유는 무엇입니까? – Donatello

1

. 이것은 Map이지만 요소 삽입 순서를 유지합니다.

map은 values ​​() 메소드를 구현하므로 newlist (map.values ​​()). get (0) 을 모방 목록 기능과 동일하게 말할 수 있습니다.

하지만지도 구현이므로 map.get ("one") 라고 말할 수도 있습니다.

관련 문제