Java получает строку из списка с целыми числами и строками

Я пытаюсь сохранить местоположение игрока в minecraft в списке, это работает хорошо, но как теперь мне вернуть свое местоположение, выполнив поиск в списке по имени игрока?

Фрагмент кода, в котором создается класс списка и список

public static class Character {

    private String name;

    private Location location;
    public Character(String name, Location location) {
        this.name = name;
        this.location = location;
    }
}

public static class Location {
    private int x;
    private int y;
    private int z;

    public Location(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

List<Character> rawInput = new ArrayList<Character>();

кусок кода, где я добавляю элемент в список:

else if (args[0].equalsIgnoreCase("select"))
{
    int tmpX = (int)player.getLocation().getX();
    int tmpY = (int)player.getLocation().getY();
    int tmpZ = (int)player.getLocation().getZ();
    rawInput.add(
        new Character( player.getName(), new Location( tmpX, tmpY, tmpZ )));
    player.sendMessage(
        ChatColor.GOLD + "[PlusCommands] " + ChatColor.GREEN
      + "selected location set to player location!");
}

Это работает нормально, но как мне вернуть данные, например:

Это список с локациями: Имя игрока X Y Z :

ИгрокТри 32 13 46

PlayerTwo 12 60 212

PlayerOne 43 62 523

Итак, я хочу найти нужного игрока в этом примере. Я PlayerOne. Поэтому я хочу получить данные из списка игроков, где строка говорит PlayerOne.

В данном случае вот этот: PlayerOne 43 62 523

Как мне это сделать???

Я надеюсь, что я достаточно ясно извините за это, если нет.


person Menno van Leeuwen    schedule 11.06.2013    source источник
comment
Добавить метод получения в свой класс?   -  person noMAD    schedule 12.06.2013
comment
Метод получения @noMAD?   -  person Menno van Leeuwen    schedule 12.06.2013
comment
Используйте карту, а не массив.   -  person Stefano L    schedule 12.06.2013


Ответы (3)


Вместо List<Character> rawInput = new ArrayList<Character>(); используйте Map<String,Character> rawInput = new LinkedHashMap<>();

Чтобы добавить игрока:

rawInput.put( aNewCharacter.getName(), aNewCharacter );

Вы должны проверить возвращаемое значение put: если оно не равно нулю, имя уже используется. Прочтите Javadoc для java.util.Map.

Чтобы найти игрока:

Character c = rawInput.get( "PlayerOne" ); // returns PlayerOne 43 62 523
person Aubin    schedule 11.06.2013
comment
Яп это все. Карты — одна из наиболее часто используемых структур данных в Java. Гораздо чаще, чем arraylist. Но будьте осторожны при использовании пользовательских объектов в качестве ключей и не реализуйте equals() и hashcode() для этих пользовательских объектов. Читайте дальше о хэш-картах, чтобы узнать почему. - person Stefano L; 12.06.2013
comment
Что такое новый персонаж? где указана локация? - person Menno van Leeuwen; 12.06.2013
comment
@StefanoL Карты — одна из наиболее часто используемых структур данных в java. Гораздо чаще, чем arraylist. Я не согласен с этим. - person Daniel Kaplan; 12.06.2013

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

package com.sandbox;

public class Sandbox {

    public static void main(String[] args) {
        Character player = new Character("Foo", new Location(1, 2, 3));

        int tmpX = player.getLocation().getX();
        int tmpY = player.getLocation().getY();
        int tmpZ = player.getLocation().getZ();
    }

    public static class Character {

        private String name;
        private Location location;

        public Character(String name, Location location) {
            this.name = name;
            this.location = location;
        }

        public String getName() {
            return name;
        }


        public Location getLocation() {
            return location;
        }


    }

    public static class Location {
        private int x;
        private int y;
        private int z;

        public Location(int x, int y, int z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        public int getZ() {
            return z;
        }
    }

}

Обратите внимание на мой main. Это показывает, что вам не нужно приводить к (int).

person Daniel Kaplan    schedule 11.06.2013
comment
где я должен вызвать getName или getY и т. д., - person Menno van Leeuwen; 12.06.2013
comment
Я думаю, мне нужно идти спать, у меня повреждение мозга :P Я пытаюсь учиться, но я не понимаю, мне жаль тратить ваше время. - person Menno van Leeuwen; 12.06.2013

Это какой-то довольно беспорядочный код.

Вам не следует создавать свой собственный класс Location или Player, так как Bukkit уже включает в себя по одному из них. Вместо того, чтобы создавать свои собственные, используйте org.bukkit.util.Location + org.bukkit.entity.Player, и у вас не должно возникнуть проблем!

person Tips48    schedule 17.06.2013