2015-09-30 3 views
0

Хорошо, может быть, не правильный заголовок, но вот что я думаю. Я ищу способ перебрать набор переменных. Например, я думаю, что в моей игре будет ряд вещей, которые вы могли бы разблокировать, и когда вы вошли в «разблокированный» или что-то, это покажет вам, что вы разблокировали, и только то, что вы разблокировали. Таким образом, он будет показывать только Булевы, которые были ложными.Перечислить переменные в Java

+0

Даже хотя это невероятно неортодоксальные - вы хотите, чтобы пользователь мог запросить о * переменных *, которая не является хорошим знаком с места в карьер - это его дело T они всегда будут спрашивать о конкретных переменных вашего класса? – Makoto

+1

Это не имеет никакого смысла. У вас есть две переменные с тем же именем. Но, возможно, вам нужно использовать java Reflexion. – ergonaut

ответ

1

Просто использовать map:

Map<String, Boolean> m = new HashMap<String, Boolean>(); 
m.put("test1", false); 
m.put("test2", true); 

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

System.out.println("is test1 " + m.get("test1")); 
+0

Зачем это делать? Помимо недостающих дженериков, это разумно –

+0

Что не так? –

+1

Почему вы отредактировали, чтобы удалить оператора бриллианта? –

5

В Java нет простого способа получить переменный, основанные на его имя. Однако вы можете хранить все свои переменные в HashMap. Это выполнит то, что вы хотите.

HashMap<String, Boolean> vars = new HashMap<>(); 
vars.put("test1", true); // to make a new variable 
vars.get("test1"); // to get a variable's value 

Если вы хотите сохранить любой тип переменной, измените инструкцию, которая создает список переменных.

HashMap<String, Object> vars = new HashMap<>(); 


Чтобы найти только booleans, которые false, вы можете просто перебрать HashMap, например, так:

for(Entry<String, Boolean> entry : vars.entrySet()) { 
    String key = entry.getKey(); 
    boolean value = entry.getValue(); 

    if(!value) { 
     System.out.println(key + " was false"); 
    } 
} 

Существует всеобъемлющее руководство here, если вы хотите узнать, подробнее о картах на Java.

+1

, это только незначительно медленнее. Хэш-карты очень быстрые –

+0

Это правда. Я думал, что это может быть медленнее, чем в «JavaScript», но это не имеет отношения к Java. – frenchDolphin

1

У вас может быть метод, который возвращает коллекцию ключей с ложными значениями. В зависимости от ваших требований (если это домашнее задание или что-то еще) есть несколько способов, которыми вы могли бы это сделать. Если требуется использовать только примитивы, вы могли бы сделать что-то вроде

public List<String> getUnlockedItems(Map<String, Boolean> map) { 
    // map validation (not null, has entries, etc) 
    final List<String> unlockedEntries = new ArrayList<>(); 
    for (Map.Entry<String, Boolean> entry : map.entries()) { 
     if (entry.getValue() == true) {// if it has been unlocked 
      unlockedEntries.add(entry.getKey()); 
     } 
    } 
    return unlockedEntries; 
} 

public static void main(String[] args) { 
    Map<String, Boolean> unlockables = new HashMap<>(); 
    unlockables.put("Fire Punch", false); 
    unlockables.put("Ice Punch", false); 
    unlockables.put("Mega Punch", false); 
    unlockables.put("Thunder Punch", false); 

    // Player unlocks Fire Punch 
    unlockables.put("Fire Punch", true); 

    // Get list of unlockables they have unlocked 
    List<String> unlockedItems = getUnlockedItems(unlockables); // returns ["Fire Punch"] 
} 

Если вы можете определить свои собственные типы, это может быть лучше с точки зрения ремонтопригодности и читаемости, чтобы сделать что-то вроде

public class Unlockable { 

    public Unlockable(String name) { 
     // name validation 
     this.name = name; 
    } 

    public void unlock() { 
     unlocked = true; 
    } 

    public boolean isUnlocked() { 
     return unlocked; 
    } 

    private String name; 
    private boolean unlocked; 
} 

А потом что-то вроде

public List<Unlockable> getUnlockedItems(List<Unlockable> unlockables) { 
    List<Unlockable> unlockedItems = new ArrayList<>(); 
    for (Unlockable unlockable : unlockables) { 
     if (unlockable.isUnlocked()) { 
      unlockedItems.add(unlockable); 
     } 
    } 
    return unlockedItems; 
} 

    public static void main(String[] args) { 
    Unlockable firePunch = new Unlockable("Fire Punch"); 
    Unlockable icePunch = new Unlockable("Ice Punch"); 
    Unlockable megaPunch = new Unlockable("Mega Punch"); 
    Unlockable thunderPunch = new Unlockable("Thunder Punch"); 

    List<Unlockable> unlockables = new ArrayList<>(); 
    unlockables.add(firePunch); 
    unlockables.add(icePunch); 
    unlockables.add(megaPunch); 
    unlockables.add(thunderPunch); 

    // Player unlocks Fire Punch 
    firePunch.unlock(); 

    // Get list of unlockables they have unlocked 
    List<Unlockable> unlockedItems = getUnlockedItems(unlockables); // returns ["Fire Punch"] 
} 
Смежные вопросы