2013-07-11 6 views
0

아직 어떤 코드 도움도 찾고 있지 않습니다.지도의 Collections.rotate와 같은 것

저는 모든 팀에 대해 텍스트 파일 입력 및 주간 경기 일정을 잡는 스케줄러를 고안하고 있습니다. 나는이 일을하고 있으며, 이제는 결과를 얻기 위해 그것을 확장하는 방법을 모색 중입니다. 지금은 모든 팀을 목록으로 읽었습니다. 조명기를 랜덤 화하기 위해 Collections.rotate를 사용하여리스트를 회전 시키십시오.

맵을 사용하여 팀 수와 승리 횟수를 생각했지만지도의 경우 회전이 작동하지 않습니다. 내가 누락 된 비슷한 기능이나 내가 간과해온 기능이 있습니까?

+1

어떻게 필드 승리를 추가하는 방법에 대한, 당신의 팀 수업을위한 세터와 게터? 그렇게하면 여전히 목록에 보관하고 이전과 같이 Collections.rotate를 사용할 수 있습니다. 조회는지도와 같은 O (1)가 아니지만 문제가 될 수있는 팀 목록이 없으며 몇 가지 요소가 있습니다. – arynaq

답변

3

지도 자체를 회전하고 싶지는 않지만 원하는 것은지도의 보기를 회전하는 것입니다.

그래서 의사 코드에서, 당신의 LinkedHashMap 작동 할 수

//make a copy of the keys of the map 
List keys = new ArrayList(yourmap.keys()) 
Collections.rotate(keys) 
//iterate over the keys of the map in the new rotated order 
for key in keys: 
    Object value = yourmap.get(key) 
    // do something with this value 
+1

지도 키가 원하는 순서대로 시작하는지 확인해야합니다. – assylias

+0

올바른지, 원래의 질문에 "목록을 회전하여 * 비품을 랜덤 화하기 위해 Collections.rotate를 사용합니다"라고 언급되었지만 다소 잘못된 것처럼 보입니다 - 실제로는 무작위가 아닙니다. - Collections.shuffle()은 더 적합하다고 생각합니다. –

+0

실제로 - OP가 무작위 화하거나 회전하려고하는지 확실하지 않습니다. – assylias

2

의 JDK의 Map 인터페이스의 3 주 비 전문, 구현이 있습니다

  • HashMap 주문하지 않습니다 - 그것이 당신에게 기반으로 정렬됩니다
  • TreeMap을 돕기 위하여려고하고 있지 않다는 일부 비교기 - 아마 쉽지는 사용 사례에 적응하기 위해 삽입 순서 또는 액세스 순서 중 하나를 주문한
  • LinkedHashMap

귀하의 경우 액세스 순서 (a special construtor with the parameter accessOrder set to true으로 생성)를 사용하여 LinkedHashMap을 사용할 수 있으며 항목 중 하나에 액세스 할 때마다 자동으로지도의 꼬리까지 재정렬됩니다. 전체 반복주기는 주문을 변경하지 않고 유지합니다.

+0

"... 항목 중 하나에 액세스 할 때마다지도의 꼬리까지 자동으로 재정렬됩니다." 액세스는 특수 생성자를 사용하여 인스턴스화하지 않는 한 아무 것도 움직이지 않으며 기본적으로 다른 모든 생성자가 map insertion-order를 만듭니다. – Brian

+0

@Brian 나는 링크 된 생성자로 생성 된 ** 액세스 순서 ***를 사용하여 *'LinkedHashMap'을 명시 적으로 언급했습니다. – assylias

+0

요점은 단지 그것을 만드는 방법이 분명하지 않다는 것입니다. 그게 전부입니다. 어떤 이유로 링크가'[]() '을 사용하지 못했기 때문에 다음과 같습니다. http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html#LinkedHashMap (int, % 20float, % 20boolean) – Brian

2

회전과 같은 일을 할 수있는,이 하나 개의 요소에 의해지도를 회전하는 방법입니다

Iterator<Entry> i = m.entrySet().iterator(); 
Entry e = i.next(); 
i.remove(); 
m.put(e.getKey(), e.getValue());