2011-12-31 2 views
2

채팅 서버에서 작업하고 있으며 클라이언트를 Hashtable에 넣을 것입니다. 이 Hashtable은 <String name, Connection c>,으로 구성되어 있으며 ConnectionSocket이고 in-out 플로우가 있습니다.Java Hashtable - 항목을 얻는 방법

Hashtable에서 닉을 찾는 메시지를 보낼 수는 있지만 어떻게 모든 사람들에게 보낼 수 있습니까?

모든 Hashtable의 항목을 "스카웃"(알 수없는 용어였습니다) 할 수 있습니까? (배열처럼, 각 항목을 "SCOUT"하고 싶습니다. 그래서 루프를 수행하고 모든 사람들에게 메시지를 보냅니다).

미리 감사드립니다.

답변

3

난 그냥 해시 테이블에 닉을 찾고 메시지를 보낼 수 ,하지만 어떻게 나는 그것을 모든 사람들에게 보낼 수 있습니까? 대안

for (String name : yourTable.keySet()) 
    yourTable.get(name).send("your message"); 

또는 :

그런 다음 해시 테이블에있는 모든 별명에 대해 동일한 작업을 수행

for (Connection conn : yourTable.values()) 
    conn.send("your message"); 
+0

두 번째 옵션은 OP가 요청한 것입니다. 첫 번째 옵션은 약간 결함이 있습니다. 실제로는 entrySet()을 가져 와서 반복해야합니다. 반복되는 키보다 효율적이므로 매번 get을 호출해야합니다. FindBugs와 Lint는 모두이를 코딩 문제로 표시합니다. – rfeak

+1

방법 2는 무엇보다 "name"을 사용할 필요가 없다고 가정하면 더 효율적입니다 *. 나는 제 3 자 웹 사이트가 말한 것과는 상관없이 접근법이 잘못되었거나 도청 된 것이라고 생각하지 않습니다. – Perception

+0

나는 그가 주어진 닉네임에 메시지를 보내는 방법을 알고있는 OPs 명시 적 공식 때문에 내가했던 것처럼 답을 공식화했다. (나는 그에게 모든 닉네임을 반복 할 수있는 방법을 제공했다.) 누가 알겠지만, 실제 메시지 형식은 대상 닉네임에 달려있다. – aioobe

0

Hashtable에는 해당 테이블의 모든 키 항목을 반환하는 keySet()이 있습니다. 내가 모바일에서 게시 오전 couldnt 당신이 예제 링크를 얻을. 모든 연결 목록을 원하면 entrySet()을 사용할 수 있습니다.

1

당신은 해시 테이블의 모든 값을 반복하고 당신이 그들 모두에게 원하는 일을 할 수 있습니다

Map<String, Connection> users; 
for (Connection connection : users.values()) { 
    // Send the message to each Socket here. 
} 
4

당신은 javadocs for HashMap을 읽고 자신의 질문에 대답 할 수있다. "javadocs 읽기"는 중요한 강의 인입니다. 초보자라면 누구나을 배우고 기억해야합니다.

  • keys() 방법은 테이블에있는 키로 구성된 컬렉션을 반환 :

    는이 경우의 javadoc는 당신에게 도움이 될 수있는 3 가지 방법을 보여줍니다.
  • values() 메서드는 테이블의 값으로 구성된 컬렉션을 반환합니다.
  • entries() 메서드는 테이블의 키/값 쌍을 나타내는 컬렉션을 반환합니다.

다른 컬렉션과 마찬가지로 이러한 컬렉션을 반복 할 수 있습니다. 다른 대답에는 몇 가지 예가 있습니다.


그러나 귀하의 응용 프로그램이 멀티 스레드 인 것처럼 보입니다.

  1. 두 개 이상의 스레드가 동일한 개체 또는 데이터 구조를 사용할 수있는 경우, 필요한를 취할 필요가 : 그 경우에는 프로그램이 신뢰할 수 있도록 당신이 다룰 필요가 다른 두 가지 문제가있다 동기화가 제대로되었는지 확인하는 단계.그렇지 않은 경우 0이 아닌 확률은 일련의 작업으로 인해 데이터 구조가 일관성없는 상태가되거나 하나 이상의 스레드가 이 일치하지 않는 것으로 간주됩니다 (메모리로 인해) 캐시, 레지스터에 저장된 값 등).

  2. 하나의 스레드가 HashMap의 컬렉션 반복기 중 하나를 사용하고 다른 스레드가 항목을 추가 또는 제거하는 경우 첫 번째 스레드는 ConcurrentModificationException이 될 가능성이 큽니다.

  3. "모두에게 보내기"작업이 진행되는 동안 HashMap에서 다른 모든 작업을 잠그면 위의 두 가지 문제를 해결하면 의도하지 않게 성능 병목 현상이 발생합니다. 기본적으로 모든 작업은 작업이 끝날 때까지 중단됩니다. HashMap 주위에 동기화 래퍼를 넣으면 비슷한 효과가 나타납니다 (미세한 스케일).

이 내용을 읽고 알아야합니다. (단 하나의 SO 응답에서 설명하기에는 너무 많은 부분이 있습니다.) 이 아마도 인 3 가지 문제에 대한 단순한 (그러나 보편적이지는 않지만) 해결책은 HashMap 대신 ConcurrentHashMap을 사용하는 경우에 사용할 수 있습니다.

+0

젠장, 자바가있는 첫해이고 두 번째는 영어이고 나는 조금 잃어 버렸다. 어쨌든, 당신의 팁 주셔서 감사합니다. 나는 내가 내일 어떻게 할 수 있는지 생각해 보겠다. 지금은 우리나라에서 꽤 늦다 : P API 팁 주셔서 감사합니다. 어쨌든, 내 첫 번째 프로젝트이므로 복잡하지 않아야합니다. – Thorba