2009-08-08 2 views
2

나는 서버라고 불리는 클래스의 객체 컬렉션을 갖고 싶습니다. 서버에는 IP 주소뿐만 아니라 많은 다른 데이터와 객체 인 문자열 속성이 있습니다.ActionScript 3에서 C#의 일반 사전의 동등 물은 무엇입니까?

이 콜렉션에 서버를 추가하고 제거하는 방법이 있습니다. 때때로 IP 주소로 서버를 찾을 필요가 있습니다. C#에서이 작업을 수행했다면 Dictionary <을 사용할 것입니다. 여기서 IP 문자열은 키이고 Server 객체는 값이됩니다. 항목을 추가하기 전에 사전에 항목이 있는지 쉽게 확인할 수 있습니다.

내 요구 사항은 다음과 같습니다. 1. 컬렉션에 항목을 추가 할 수있는 기능 (앞뒤, 중간에 상관 없음) 2. 컬렉션의 어느 위치에서나 항목을 제거 할 수 있습니다. 3. 특정 IP 주소가 컬렉션에 이미 있는지 확인하는 기능. 4. IP로 서버 개체에 대한 참조를 가져 오는 기능. 편집 : 오 예, 강력하게 벡터처럼 타이핑하고 싶습니다 ... 절대적으로 필요한 것은 아니지만 좋을 것 같습니다.

# 3 또는 # 4를 수행하는 방법에 대해 잘 모르는 것을 제외하고는 연관 배열이 내게 필요한 것을 줄 것 같습니다.

public var Servers:Object = new Object(); 

public function AddServer(server:Server):void 
{ 
    //TODO:need to check if it exists first and throw an error if so 
    //(it's the caller's responsibility to call DoesServerExist first) 

    Servers[server.IP] = server; 
} 


public function RemoveServer(IP:string):void 
{ 
    //is it OK to attempt to delete an item if it doesn't already exist? 
    //do I need to check if it exists before doing delete? 
    delete Servers[IP]; 
} 

public function DoesServerExist(IP:string):bool 
{ 
    //Do I loop through all the elements testing it's IP property? 
    //Or can I just do something like this? 
    if(Servers[IP] == null) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 

public function GetServer(IP:string):Server 
{ 
    return Servers[IP];//what is returned if this IP doesn't exist? 
} 
+0

개인적으로 IP 주소를 int로 저장하고 싶습니다 ... 32 비트가 유효한 ip입니다 ... "123.456.789.876"은 ... 디자인과 관련하여 개인/보호 된 변수를 만들 것입니다 ... 그리고 관례에 따라 UpperCamelCase는 as3의 클래스를 위해 예약되어 있습니다 ... 완전히 주관적입니다.하지만 일부 공동 작업을 시작할 계획이라면 익숙해지기를 원할 것입니다. – back2dos

+0

한번보세요. 실제로 haxe.org (haxe.org) ... 제네릭을 지원합니다 ... 해시 ...과 별개로 훌륭한 젊고 유망한 언어입니다. – back2dos

답변

3

goofy로 전화를 걸지만 Dictionary 클래스를 사용하지 않는 이유는 무엇입니까? 그것은 당신에게 강력한 타이핑을 제외한 모든 것을 가져옵니다.

강력한 타이핑을 원한다면 서버 벡터를 래핑하는 사용자 지정 컨테이너와 벡터에 인덱싱하는 IP 문자열의 사전 또는 연관 배열이 필요하다고 말하고 싶습니다. 그런 다음 액세스, 테스트, 삽입 및 제거를위한 메서드를 노출해야합니다.

+1

클래스 내에서 조회 사전을 숨기고 add (ip : String, 서버 : 서버) : void, remove (ip : String) : 서버 및 가져 오기 (IP : 문자열) : 서버 ... greetz – back2dos

-3

배열을 사용할 수 있습니다. 예 :

var dict:Array = []; 
var ip = "164.157.012.122" 
dict[ip] = "Server name" 

if (dict[ip] == "Server name"){ 
    trace("Yay"); 
} 

//membership 
if (dict[ip]){ 
    trace(ip + " is a member of dict"); 
} else { 
    trace (ip + " is not a member"); 
} 

//removal: 
dict[ip] = null; 

AS3에는 실제로 불행히도 사전 클래스가 내장되어 있지 않습니다.

+0

멤버쉽 테스트 코드를 제공해 주셔서 감사합니다. . 배열을 사용하기로 선택한 이유가 혼란 스럽습니다. 문자열 인덱스에 배열을 사용하지 않는다는 문서가 나타나는 이유는 무엇입니까? 그들은 배열 함수 중 아무 것도 작동하지 않는다고 말하며, 단지 연관 배열에 객체를 사용하는 것과 다르지 않습니다. – AaronLS

+0

맞습니다. 배열과 객체 간에는 실제적인 차이가 없습니다. 방금 습관을 사용했습니다. 배열 함수 중 일부를 원한다면 다음과 같은 것을 사용하는 것이 좋습니다 (http://code.ericfeminella.com/classes/as3/HashMap.as.html). – thedayturns

+1

1. AS3에는 사전 클래스가 있습니다. 2. delete 연산자로 올바른 제거가 이루어지면 키가 실제로 사라져서 for-in 루프의 모든 키를 얻을 수 있습니다. 3. 올바른 조회는 dict.hasOwnProperty (id) – back2dos

관련 문제