2015-08-19 3 views
-1

У меня есть класс, как определено ниже:Unique User Input Массив Список

общественного класс CarHireSystem {

частное статическое окончательное автомобилей [] Карлистские = новый автомобиль [100]; private static int carCount = 0;

В этом классе у меня есть меню, в котором пользователь может добавить новый автомобиль. Когда они выбирают этот вариант, им будет предложено следующим:

System.out.print("Enter car ID: "); 
    String carID = sc.nextLine(); 
    System.out.print("Enter car description: "); 
    String cardescription = sc.nextLine(); 
    System.out.print("Enter hire fee: $"); 
    Double hireFee = sc.nextDouble(); 
    sc.nextLine(); 
    carList[carCount] = new Car(carID,carDescription,hireFee); 
    carCount++; 

Я хотел бы способ проверки, что автомобиль ID вошел в массив еще не был введен пользователем и выводит сообщение об ошибке, если был введен и возвращен в главное меню. Как это сделать без использования Hashmap.

Благодаря

+2

магазин вход в 'Set', а не массив –

+0

я обязан передать информацию в массив ссылок. Я могу сделать это с помощью приведенного выше кода, но я хочу, чтобы идентификатор был уникальным. – newbie123

+0

@kocko Затем @ newbie123 нужно будет переопределить 'equals()' и 'hashCode()'. –

ответ

0
boolean exists = false; 
for (AdventureRide ar : adventureList) { 
    if (ar != null && ar.getID().equals(ID)) { 
     exists = true; 
     break; 
    } 
} 
if (!exists) { 
    adventureList[adventureCount++] = new AdventureRide(ID, description, admissionFee); 
} 

перебрать массив; если существует элемент с тем же идентификатором, разбейте цикл for и установите флаг exists. Затем в конце проверьте, установлен ли флаг exists. Если нет, добавьте новый элемент в массив.

+0

Привет, Я пытаюсь использовать этот метод, но я получаю исключение nullpointer, потому что в данный момент ничего нет в массиве. Как обойти это? – newbie123

+0

Добавить проверку 'ar! = Null' - я обновил свой ответ. –

+0

, похоже, не работает. Он все еще позволяет мне вводить тот же ID. – newbie123

0

Проверьте, есть ли он в списке или нет, добавьте его.

List<AdventureRide> list = new List(); 
AdventureRide ride = new AdventureRide(ID,description,admissionFee); 

if(!list.contains(ride)) 
list.add(ride); 

Если вы хотите сделать это с эталонами ID, вы можете использовать HashMap.

HashMap<Integer, AdventureRide> = new HashMap(); 
AdventureRide ride = new AdventureRide(ID,description,admissionFee); 
if(!hm.containsKey(ID)) 
    hm.put(ID,ride); 
0

У вас есть 2 варианта:

  1. пройти через массив каждый раз, когда вы хотите, чтобы ввести что-то и убедитесь, что в настоящее время ID нет в массиве.

  2. иметь свой AdventureRide переопределить equals и hashCode методы, такие, что два элемента являются одинаковыми, если они имеют один и тот же ID. После этого замените массив на Set<AdventureRide>. Это позволит вам иметь записи с уникальным ID.

Я рекомендую вам пойти на вариант 2, причина в том, что:

  1. Если по линии вы должны проверить некоторые другие поля, вам просто нужно будет изменить equals и hashCode методы ,
  2. Поскольку Set - это динамическая структура данных, вы можете добавить/удалить из него, не зная количества записей перед началом работы.
0

Вы также можете использовать Set<String> для хранения идентификатора, а вызов содержит() или get() с нулевой отметкой. Или сохраните экземпляры AdventureRide в Map<String,AdventureRide>. Например:

Map<String,AdventureRide> adventureMap = new HashMap<String,AdventureRide>(); 
... 
private static final void addNewAdventure() 
    { 
     boolean idExists = false; 
     System.out.print("Enter ID: "); 
     String id; 
     do { 
     id = sc.nextLine(); 
     if(null != adventureMap.get(id)) { 
      idExists = true; 
      System.out.println("The ID you entered already exists.\n Please enter a new ID: ");    
     } 
     } while(idExists); 
     System.out.print("Enter story: "); 
     String description = sc.nextLine(); 
     System.out.print("Enter fee: $"); 
     Double admissionFee = sc.nextDouble(); 
     sc.nextLine(); 
     adventureMap.put(id, new AdventureRide(id,description,admissionFee)); 
    //keep track of objects in array 
     adventureCount++; 
    } 
0

Вы можете автоматически генерировать уникальный идентификатор, а не позволять пользователю вводить его.Таким образом, вам даже не нужно проверять дублированный идентификатор.

В ваших кодов, вместо того, чтобы сделать это:

adventureList[adventureCount] = new AdventureRide(ID,description,admissionFee); 

Изменить его:

adventureList[adventureCount] = new AdventureRide(description,admissionFee); 

Тогда в классе AdventureRide:

class AdventureRide 
{ 
    private static int count = 0; 
    private String id; 
    public AdventureRide(String desc, double adminFee){ 
     autoGenerateID(); //Auto generate formatted ID 
    } 

    private void autoGenerateID(){ 
     DecimalFormat fmt = new DecimalFormat("T-00000"); 
     id = fmt.format(count++); 
    } 
} 

DecimalFormat для форматирования идентификатора конкретный формат. Это, конечно, необязательно.

Выход:

T-00000 
T-00001 
T-00002 
T-00003