2016-04-05 2 views
2

Хорошо, извиняюсь, если это уже ответили. Я попытался посмотреть, но ответа не нашел.Проверка наличия экземпляра определенного класса в списке

Теперь у меня есть класс утилиты связанного списка (связанный в одном направлении), который содержит различные универсальные утилиты для разных вещей. То, что я пытаюсь сделать, это сделать метод, который способен принимать в качестве параметра экземпляр любого заданного класса, а затем проверяет, существует ли экземпляр такого класса в списке, возвращая true, если это так, и false, если оно не делает. Сам список содержит экземпляры нескольких разных классов.

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

if (foo instanceof Enemy) { . . . }

Вот что я изначально пытался сделать: // этот метод находится внутри LinkedList класса

public boolean exists(Object o) 
{ 
    int i = 0; 
    boolean output = false; 
    //koko() returns the size of the linked list 
    while(i < koko() && !output) 
    { 
     //alkio(i) returns an Object type reference to the entity in index i 
     if(alkio(i) instanceof o.getClass()) 
     { 
      output = true; 
     } 
    } 
    return output; 
} 

Но это привело это: https://www.dropbox.com/s/5mjr45uymxotzlq/Screenshot%202016-04-06%2001.16.59.png?dl=0

Да, это домашнее задание (или скорее, часть большой домашней работы), но учитель не ответит на двух AM, и мой google-fu слишком слаб.

halp плз

  • Нар
+0

Почему вы принимаете за ввод объекта вместо «класса»? –

+0

Как взять класс в качестве параметра? Это было бы проще всего, но я не знал, что это возможно ... что такое синтаксис? – Narmondur

+0

Как вы думаете, o.getClass возвращается? Он возвращает класс. Или вы можете написать литерал 'MyClass.class'. –

ответ

1

Динамический способ сделать instanceof это использовать Class.isInstance() метод:

Определяет, является ли указанный Object является совместимым с объектом с объектом, представленным этим Class. Этот метод является динамическим эквивалентом оператора Java instanceof.

Таким образом, alkio(i) instanceof o.getClass() должно быть написано o.getClass().isInstance(alkio(i)).

+0

и просто чтобы убедиться: если параметр, заданный методу, имеет тип Foo , а ссылка, возвращаемая alio (i), указывает на экземпляр, например ... Object-class, метод, о котором вы мне говорили, вернет false? – Narmondur

+0

И наоборот, если объект с индексом i будет иметь тип Foo, он вернет true? – Narmondur

+0

@ Нармондур Исправить. – Andreas

0

Как насчет этого?

public static void main(String[] args) 
{ 
    Integer myInt = 1; 
    System.out.println(exists(Arrays.asList(1, 2, 3), myInt)); //true 
    System.out.println(exists(Arrays.asList("1", "2", "3"), myInt)); //false 

} 

/** 
* Returns whether an object exists in @list that is an instance of the class of object @o. 
*/ 
public static boolean exists(List<?> list, Object o) 
{ 
    return list == null || o == null ? false : list.stream().filter(o.getClass()::isInstance).findAny().isPresent(); 
} 
+0

Извините, я не могу понять это ... что вы собираетесь здесь? – Narmondur

0

Если я правильно понимаю ваш вопрос, то вам необходимо пройти класс в методе, а не экземпляр класса:

public boolean exists (Class checkClass) { 
    ... 
    if (item.getClass().equals(checkClass)) { 
     return true; 
    } 
    ... 
} 

Вы тогда называем это как:

if (myList.exists(Enemy.class)) { 
    ... 
} 

Однако вы должны рассмотреть другую модель, так как это показывает довольно плохой объектно-ориентированный дизайн. Лучшим подходом было бы иметь interface, представляющий все, что может быть на вашей карте. Что-то вроде:

public enum MapObjectType { 
    ENEMY, ALLY, WALL; 
} 

public interface MapObject { 
    MapObjectType getType(); 
} 

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

public class Enemy implements MapObject { 

    @Override 
    public MapObjectType getType() { 
     return MapObjectType.ENEMY; 
    } 
} 

Тогда ваш метод может быть более разумным:

public boolean hasObjectOfType(MapObjectType type) { 
    ... 
    if (item.getType().equals(type)) { 
     return true; 
    } 
    ... 
} 
+0

Это звучит очень аккуратно ... поэтому, если я правильно понимаю, перечисление содержит все, что входит в карту, и интерфейс ... как насчет интерфейса? Связан ли связанный список с этим интерфейсом? Интерфейс MapObject содержит только метод, упомянутый выше? – Narmondur

+0

@Narmondur enum представляет типы объектов, которые входят в карту. Затем каждый класс объекта должен реализовывать интерфейс. Я добавлю пример ответа. – sprinter

+0

Я решил это с помощью метода Class.isInstance(), главным образом потому, что я подозреваю, что учитель слегка хмурился в использовании перечислений, поскольку мы не прошли через них (только причина, о которой я знаю о них, я случайно наткнулся на один раз выше моего уровня мастерства, и они упомянули об этом). Кроме того, использование метода, специально созданного мной для другого класса, приведет к победе над универсальным характером, который должен иметь конкретная реализация связанного списка. Независимо от этого, я собираюсь сохранить эту страницу где-нибудь, потому что ваш ответ дал мне ценную информацию. Я буду использовать в будущем. Спасибо :) – Narmondur

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