2016-05-18 4 views
0

В настоящее время я работаю над программой, в которой у меня есть большое количество объектов (все элементы из периодической таблицы), и было бы огромной болью создать список для более 100 объектов. Есть ли способ, который я могу объявить и создать экземпляр всех объектов один раз и иметь способ читать класс, в котором они существуют? Например, если пользователь вводит «Он», я могу найти соответствующий объект, который содержит элемент «Символ» «Он»? Я должен был бы иметь возможность проверять каждый объект, используя метод getSymbol, который возвращает свой символ, а затем сравнивает его со входом. После этого я планирую использовать другие поля, назначенные объекту, такие как молярная масса для вычислений, но это не будет проблемой. Если есть другой способ эффективно сделать это, мы будем очень благодарны.Как найти объект без arrayList

+1

Почему вы не хотите использовать ArrayList? Для меня это звучит как идеальный вариант использования. – moscar

+0

@moscar Точно, что я тоже думал. Просто добавьте классы элементов в список массивов и используйте lambda для выбора того, что требуется на основе идентификатора элемента. – ManoDestra

+0

Этот парень также сделал это с перечислениями: https://gist.github.com/felixdivo/11159677. Вот что сказал В. Вовка в своем ответе ниже. Перечисление является элегантным решением для этого требования, учитывая постоянный характер периодической таблицы. – ManoDestra

ответ

3

Вы должны хранить все в Map с elementSymbol как ключ и ваш object в качестве значения, то вы сможете получить доступ к объекту по телефону map.get(elementSymbol).

Подробнее о классе Maphere

1

вы можете использовать hashmap для этого.

HashMap<String,PeriodObject> peridicTable = new HashMap<String,PeriodObject>(); 
periodictable.add("he",object); 
periodicTableobject = periodictable.get("he"); 
3

Как у вас есть постоянное количество объектов, то лучше управлять их перечисления:

public enum Elements { 
    ag(10), //10 here is the molarMass constructor parameter 
    he(20); 

    //constructor if needed 
    Elements(int molarMass) { 
     this.molarMass = molarMass; 
    } 

    //extra fields 
    final private int molarMass; 
} 

прибудете:

Elements.valueOf("he") 
+0

Как бы я смог найти этот класс или проверить каждое перечисление на вход? Я не очень хорошо знаком с перечислениями –

+0

Элемент he = Element.valueOf ("he");/* "he" его строка ввода */ int m = he.getMolarMass(); – Vovka

0

Не знаю, почему вы непрочь используя ArrayList, это идеальное решение для вашего требования. Я думаю, что использование Enum - лучшее решение, учитывая постоянный характер периодической таблицы, но я добавляю этот ответ в List, используя API потоков для полноты.

import java.util.ArrayList; 
import java.util.List; 

public class Test { 
    public static void main(String[] args) { 
     Test test = new Test(); 
     test.run(); 
    } 

    private void run() { 
     List<Element> elements = new ArrayList<>(); 
     Element oxygen = new Element("O", "Oxygen"); 
     Element carbon = new Element("C", "Carbon"); 
     Element hydrogen = new Element("H", "Hydrogen"); 
     Element helium = new Element("He", "Helium"); 
     elements.add(oxygen); 
     elements.add(carbon); 
     elements.add(hydrogen); 
     elements.add(helium); 

     System.out.println("All Elements:"); 
     for (Element element : elements) { 
      System.out.println("\t" + element); 
     } 

     System.out.println(); 

     Element oxy = elements.stream().filter(e -> e.getId().equals("He")).findFirst().get(); 
     System.out.println("Specific Element: " + oxy); 
    } 

    private class Element { 
     private final String id; 
     private final String name; 

     public Element(String id, String name) { 
      this.id = id; 
      this.name = name; 
     } 

     public String getId() { 
      return this.id; 
     } 

     public String getName() { 
      return this.name; 
     } 

     @Override 
     public String toString() { 
      return this.getName() + " [" + this.getId() + "]"; 
     } 
    } 
} 
+0

Было достаточно утомительно, чтобы вручную вводить каждый элемент, и я решил, что должен быть более эффективный способ доступа к ним. Я действительно не хотел возвращаться и делать list.add() более 100 раз. Я уверен, что есть лучший способ сделать это со списком, но с использованием перечисления, чтобы они работали намного лучше –

Смежные вопросы