Java, выбирающий экземпляр объекта - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть флот. fleet.java

Каждый флот имеет набор кораблей. ship.java

У каждого корабля есть набор членов экипажа. crewmember.java

В Главном я добавляю корабли к флоту и членов экипажа к кораблям, читаю из списка обоих.

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

this.addships (судно)

this.shipname.addcrewmember (член экипажа)

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

public void loadStarships( String filename ) {
    File file = new File( filename );
    Scanner scan;

    try {
        scan = new Scanner( file );

        while( scan.hasNextLine() ) {
            String line = scan.nextLine();
            String[] tokens = line.split(",");
            Starship star = null;

            star = new Starship( tokens[0], tokens[1], tokens[2]);

            this.addStarship( star );
        }

        scan.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void loadCrew( String filename ) {
    File file = new File( filename );
    Scanner scan;
    try {
        scan = new Scanner( file );

        while( scan.hasNextLine() ) {
            String line = scan.nextLine();
            String[] tokens = line.split(",");
            CrewMember member = null;

            member = new CrewMember( tokens[0], tokens[1], tokens[2], tokens[4]);

            this.tokens[3].addCrewMember( member );
        }

        scan.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public Starship( String name, String registry, String level) {
    this.name = name;
    this.registry = registry;
    this.level = level;
    this.crewmembers = new ArrayList<CrewMember>();
}

//adds new crew members
public void addCrewMember( CrewMember crewmembers ) {
    this.crewmembers.add( crewmembers );
    this.numberOfCrewMembers++;
}

public CrewMember( String name, String position, String rank, String species ) {
    this.name = name;
    this.position = position;
    this.rank = rank;
    this.species = species;
}
//set the fleet name and the maximum number of starships
public Fleet(String name) {
    this.name = name;
    this.starships = new ArrayList<Starship>();
}

1 Ответ

0 голосов
/ 14 сентября 2018

Первое правило разработки программного обеспечения - «используйте правильную структуру данных для работы». В существующем состоянии вы сохраняете экземпляры корабля в ArrayList, что позволяет получать элементы только по индексу.

Хотя вы и не предоставили запрошенные образцы данных, достаточно просто сделать вывод, что token[3] - это название корабля, к которому принадлежит член экипажа, поэтому вам нужно выяснить, как получить объект по имени.

К счастью, Java предоставляет вам HashMap , в котором хранятся пары ключ-значение. Вы можете использовать название корабля в качестве ключа. Когда вы передадите этот ключ в HashMap, он вернет значение, связанное с этим ключом - в вашем случае, тот экземпляр корабля, который вам нужен.

1) Убедитесь, что ваш класс импортирует java.util.HashMap;

2) Объявите свой HashMap. Вместо:

ArrayList<Starship> ships = new ArrayList<Starship>();

использование:

HashMap<String, Starship> = new HashMap<String, Starship>();

В этой ситуации ключом является строка, представляющая название корабля. Экземпляр корабля с таким именем является значением.

3) При добавлении нового корабля вам нужно будет обновить свой метод addStarship(), чтобы он брал строковый аргумент в дополнение к аргументу звездного корабля, который он уже занимает:

public void addStarship(String name, Starship ship)

4) В теле addStarship() вы должны добавить корабль, используя put() метод:

ships.put(name, ship);

Помните, здесь ships - это экземпляр HashMap, который вы используете для хранения своих кораблей. name - это строка, представляющая название корабля, а ship - объект корабля.

5) Когда вы пытаетесь получить корабль, вы используете метод get():

ships.get(name);

В вашем случае код может выглядеть следующим образом:

ships.get(tokens[3].addCrewMember(member));

Имейте в виду, что с HashMap вы больше не можете получать значения по индексу, как с ArrayList. HashMap по определению является неупорядоченным набором, то есть первый элемент структуры может быть или не быть первым добавленным вами объектом, и даже если вы получили доступ к объекту в первой позиции, нет гарантии, что он все еще будет находиться в этом слоте, если вы попытаетесь получить к нему доступ позже - его позиция в HashMap могла измениться, поэтому вы, как правило, будете получать значения только с помощью ключа.

Пожалуйста, убедитесь, что вы прочитали официальную документацию, на которую я ссылался, выше.

...