해시 맵을 작성하는 대신 "쌍"또는 n 사이즈를 목록 컬렉션에 삽입하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/835359

문제

그래서 나는 세 가지 값을 일련의 차단 큐 큐에 전달 해야하는 상황이 있습니다.

(SelectableChannel, ComponentSocketBasis, Integer).

그들은 실제로 해시 맵핑 될 필요는 없으며, 해시 맵을 사용하는 것은 각 항목에 항상 하나의 키만 있기 때문에 말도 안됩니다. 그들이 단지 어떤 종류의 순서 세트에 있다면 괜찮을 것입니다. 그러나 알려진 대안이 부족하기 위해, 나는 구현에 해시 맵을 사용 하고이 난독 화 된 제네릭 컴포지션을 생성했습니다.

private LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>> deferredPollQueue = new LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>>();

이것은 정말 우스운 것 같습니다. 나는 끔찍한 N00B 여야합니다. 확실히이 작업을 수행하는 더 좋은 방법이 있습니다. 값을 검색하거나 낭비 할 때 열쇠를 분해 할 필요가없는 더 좋은 방법이 있습니다. 나는 1의 핵심 공간이 있고 세 가지 참고 문헌을 관계 적으로지도하고 싶지 않지만 단지 그룹을 그룹화하기 때문에? 이 구현을 통해 값을 꺼내야합니다.

while(deferredPollQueue.size() > 0) {
    System.out.println("*** Draining new socket channel from queue");
    HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer> p = deferredPollQueue.take();

    SelectableChannel chan = null;
    ComponentSocketBasis sock = null;
    int ops = 0;

    HashMap<SelectableChannel, ComponentSocketBasis> q = p.keySet().iterator().next();

    chan = q.keySet().iterator().next();
    sock = q.get(chan);

    ops = p.get(q).intValue();

    SelectionKey k = chan.register(selector, ops);  

    if(!channelSupervisorMap.containsKey(k))
        channelSupervisorMap.put(k, sock);
}

나는 여기서 지각있는 이유가있는 모든 것이 아마도 이것이 말도 안되는 방법이라고 생각할 것입니다. 따라서 질문은 - 올바른 방법은 무엇입니까? :) 나는 java.util.pair 또는 java.util.triplet의 증거를 찾을 수 없습니다.

나는 정통 방식 (TM) 이이 트리플렛을 수용 할 목적으로만 맞춤형 클래스 나 인터페이스를 수행하는 것이라고 생각하지만, 그러한 큰 시스템에서 그러한 작은 작업을 위해 이것은 터무니없는 장황과 불필요한 것처럼 보입니다. 그것은 자바 그 자체입니다.

마찬가지로, 아마도 값은 어레이리스트 나 벡터 또는 파생물에 넣을 수 있지만 Java에서는이 해시 맵에서 벗어나는 것보다 더 많은 간결한 방법을 생성하지는 않지만 해결하지만 해결합니다. 알고리즘 복잡성 문제 일 것입니다.

Perl Land로 돌아가서 배열 참조를 배열 내부의 값으로 사용 하여이 작업을 수행합니다.

push(@$big_queue_array, [$elem1, \%elem2, \@elem3]);

Java에서 가장 동등한 것은 무엇입니까?

도움이 되었습니까?

해결책

왜 자신만의 일반 쌍이나 트리플 클래스를 만들지 않겠습니까? 거의 모든 Java 5+ 프로젝트는 자신의 Util Classment에 있습니다!

다른 팁

삼중 항을 보유하는 커스텀 클래스는 부풀어 오르고 불필요 할 것이라고 말하지만, 이것이 실제로 그렇게하는 방법입니다. 이것이 바로 객체 지향 모델링이 작동하는 방식입니다. 사용자 정의 클래스는 명시적이고 읽기 쉬우 며 일반 보유자 클래스보다 더 이상 런타임 리소스를 차지하지 않습니다.

기능적 자바 가지다 한 쌍, 트리플렛, 그리고 Arity까지 튜플 8. HList 임의의 아티시를 위해. 그래서 당신의 유형은 다음과 같습니다.

LinkedBlockingQueue<P3<SelectableChannel, ComponentSocketBasis, Integer>>

이것은 단지 라이브러리 일 뿐이므로 클래스 경로에 항아리를 떨어 뜨리면 가기에 좋습니다.

어떤 객체가 어느 위치에 있는지 알기 때문에 Arraylist를 사용하여 객체를 저장할 수 있습니다. 멤버를 선택하여 새로운 클래스를 만들 수 있습니다. selectablechannel 및 componentsocketbasis가 더 나을 것입니다.

이런 종류의 일을 많이하려고한다면 일반 쌍이나 튜플을 만들면 이제 많은 시간을 절약 할 수 있지만, 이것이 유일하게 사용할 곳이라면 새로운 것을 만들어냅니다. 클래스는 코드를 읽기가 훨씬 쉬워집니다.

코드에서 클래스 이름을 볼 때마다, 그것이 무엇인지 정확히 알 수 있지만, 일반적인 합병을 보면, 당신 (또는 다른 사람)이 사용하는 것을 이해하기가 더 어려울 수 있습니다.

프로그래밍 시간과 가독성 사이의 상충 관계입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top