2016-11-17 2 views
0

int ID 인스턴스 변수가있는 클래스 (자동차)가 있습니다.특정 고유 한 인스턴스 변수에서 객체를 가져 오는 중 -

ID가 반드시 고유 할 필요는 없습니다. 더 많은 카테고리 ID입니다. ID가 나는 것을 확인하려면이 클래스의 인스턴스를 생성하기 전에 ID는 내가 그 ID

으로 새 범주를 만들 존재하지 않는 경우 내가 그 범주 내에서 배열 목록에 개체를 추가 존재하는 경우

해당 ID를 가진 인스턴스 변수가 이미 없습니다.

나는 지금 당장이 일을 생각할 수있는 유일한 방법은 클래스 차량 내에있는 모든 차량의 정적 arraylist를 갖는 것입니다. 그런 다음 각 차량을 통해 배열 목록을 검색하고 ID를 비교하여 이미 일치하는 ID가 있는지 확인합니다. 그렇지 않은 경우 - 새 ID로 새 자동차 인스턴스를 만듭니다.

확실히 더 좋은 방법이 있습니까?

+0

기존 자동차 ID를 추적 할 수있는'Map '를 사용할 수 있습니다. –

+0

[자바에서 객체 ID를 할당하는 우아한 방법] (0120-388-301) –

+0

'Set ', 특히 자바에서 객체 ID를 할당하는 우아한 방법 'HashSet '이 작동합니다. 그것은 '자동차'클래스에 속하지 않을지도 모른다. – bradimus

답변

0

지도를 사용하면 Lutz Horn에서 제안한대로 모든 ID를 유지하는 것이 더 좋으며 HashMap은 일반적으로 컨테이너의 모든 요소를 ​​검색하는 대신 O (1)의 런타임 복잡성에서이를 수행합니다. 명부.

여러 스레드를 사용하여 자동차를 동시에 만들 수있는 경우 경쟁 조건을 입력하지 않아야합니다.

+0

O (1)은이 작업에 대한 정말 마술적인 구현이 될 것입니다 :-) –

+0

해시 맵이 작동하는 방식입니다. – Mike

+0

글쎄, 만약 그렇다면 해시의 충돌은 ...하지만 그렇지 않으면 ... http://stackoverflow.com/questions/8923251/what-is-the-time-complexity-of-hashmap-containskey-in-java –

0

ID를 고유하게하려면 클래스 디자인에 새로운 개체를 만들 때마다 기존 ID를 모두 검사하지 않고 중복을 방지하는 메커니즘이 있어야합니다.

public class Car{ 

    private static int counter = 1; 
    private int id; 

    public Car(){ 
     id = counter ++; //auto-generate a new id when car is created 
    } 
} 

예 : 문제에 대한 좋은 선택지가 될지도를 사용

Car c1 = new Car(); //id is 1 
Car c2 = new Car(); //id is 2 
Car c3 = new Car(); //id is 3 
+0

질문을 업데이트하여 고유 한 ID 일 필요는 없음 - 혼란 스럽습니다. – Silk13

+0

@ Silk13 요구 사항이 다소 이상합니다. 왜 다른 카테고리를 다른 목록에 추가해야하는지 알려주고 싶을 수 있습니다. 이것은 나에게 [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)처럼 보입니다. 더 많은 가능한 카테고리가 얼마나 될까요? 수천? – user3437460

0

다음은 당신이 고려할 수 있습니다 하나의 예를 보여줍니다. 하지만 의미 론적으로 말하자면 Car 클래스 안에 해당 맵을 가지고 있다는 것은 좋은 생각이 아닙니다. 어쩌면 더 가능성이 CarFactory 또는

은 당신이에 대한 CarFactory 사용한다고 가정합시다 CarManager 클래스 : 당신이 독특한 생성하는 방법을 사용할 수있는이 방법의 대안으로

public class Car { 
    public Car(String ID) { 
     // construct the instance 
    } 
    // car's behaviour here 
} 

public class CarFactory { 
    private Map<String, Car> existingCars; 
    private CarFactory() { 
     existingCars = new HashMap<>(); 
    } 
    private static CarFactory factory; 
    public static CarFactory getFactory() { 
     if (factory == null) { 
     factory = new CarFactory(); 
     } 
     return factory; 
    } 

    // Now our method 
    public Car getBrandNewCar(String ID) { 
     if (existingCars.containsKey(ID) { 
     throw new IllegalArgumentException("The car already exists..."); 
     } else { 
     Car car = new Car(ID); 
     existingCars.put(ID, car); 
     return car; 
     } 
    }  
} 

을 ID가 호출 될 때마다 ID를 사용하기 전에 확인하지 않아도됩니다. 예를 들어 에 의해 공유 된 링크를 통해 @Julien Lopez의 의견

관련 문제