Java & mdash; Как создать 2d ArrayList объектов из пользовательского класса для карты текстовой игры (x, y) координат [duplicate]

Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)

Модель цикла события и параллелизма

Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек

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

while (queue.waitForMessage()) {
   queue.processNextMessage();
}

Как только он получает сообщение для запуска чего-то, он добавляет его в очередь. Очередь - это список вещей, которые ждут выполнения (например, ваш запрос AJAX). Представьте себе это так:

 1. call foo.com/api/bar using foobarFunc
 2. Go perform an infinite loop
 ... and so on

Когда одно из этих сообщений будет исполнено, оно выталкивает сообщение из очереди и создает стек, стек - это все, что нужно выполнить JS для выполнения инструкции в сообщение. Таким образом, в нашем примере ему говорят позвонить foobarFunc

function foobarFunc (var) {
  console.log(anotherFunction(var));
}

. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)

. Главное здесь - порядок выполнения. Это

КОГДА что-то будет запущено

Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.

Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, ​​и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.

Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done deffered.fail и deffered.always (среди других). Вы можете увидеть их все здесь

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

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

function foo(bla) {
  console.log(bla)
}

, поэтому большую часть времени (но не всегда) вы пройдете foo не foo()

. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.

102
задан Alexis King 8 March 2015 в 00:31
поделиться

13 ответов

Из Object.toString () docs:

Возвращает строковое представление объекта. В общем случае метод toString возвращает строку, которая «текстово представляет» этот объект. Результат должен быть кратким, но информативным представлением, которое легко читать человеку. Рекомендуется, чтобы все подклассы перекрывали этот метод.

Метод toString для класса Object возвращает строку, состоящую из имени класса, объектом которого является экземпляр, символа at-sign `@ 'и шестнадцатеричного представления без знака хеш-кода объект. Другими словами, этот метод возвращает строку, равную значению:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Пример:

String[] mystr ={"a","b","c"};
System.out.println("mystr.toString: " + mystr.toString());

output:- mystr.toString: [Ljava.lang.String;@13aaa14a
76
ответ дан Sean Patrick Floyd 28 August 2018 в 00:07
поделиться

Он может иметь возможность использования в контексте приложения, но гораздо чаще используется для целей отладки. Например, когда вы нажимаете точку останова в среде IDE, гораздо легче читать значимые объекты toString(), чем проверять их члены.

Не существует установленного требования для того, что toString() метод должен делать. По соглашению, чаще всего он укажет вам имя класса и значение соответствующих членов данных. Чаще всего методы toString() автоматически генерируются в IDE.

Опираясь на конкретный вывод из метода toString() или анализируя его внутри программы, это плохая идея. Что бы вы ни делали, не сходите по этому маршруту.

14
ответ дан cletus 28 August 2018 в 00:07
поделиться

Если вы сначала изучите Python, а затем Java. Я думаю, что он играет ту же роль, что и метод __str__() в Python, это магический метод , подобный __dict__() и __init__(), но ссылающийся на строку, представляющую объект.

1
ответ дан Community 28 August 2018 в 00:07
поделиться

Помимо того, что cletus ответил относительно отладки, он используется всякий раз, когда вы выводите объект, например, когда вы используете

 System.out.println(myObject);

или

System.out.println("text " + myObject);
3
ответ дан Frank 28 August 2018 в 00:07
поделиться

Основная цель toString - создать строковое представление объекта, означает, что возвращаемое значение всегда является строкой. В большинстве случаев это просто класс объекта и имя пакета, но в некоторых случаях, таких как StringBuilder, вы получите фактически текст String.

2
ответ дан heb 28 August 2018 в 00:07
поделиться

Метод toString() возвращает текстовое представление объекта. Базовая реализация уже включена в java.lang.Object, и поэтому, поскольку все объекты наследуются от java.lang.Object, гарантируется, что каждый объект в Java имеет этот метод.

Переопределение метода всегда является хорошей идеей, особенно когда он приходит к отладке, потому что отладчики часто показывают объекты по результату метода toString(). Поэтому используйте значимую реализацию, но используйте ее для технических целей. Логика приложения должна использовать геттеры:

public class Contact {
  private String firstName;
  private String lastName;
  public Contact (String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public String getFirstName() {return firstName;}
  public String getLastName() {return lastName;}

  public String getContact() {
    return firstName + " " + lastName;
  }

  @Override
  public String toString() {
    return "["+getContact()+"]";
  }
}
29
ответ дан mustaccio 28 August 2018 в 00:07
поделиться

Кодирование:

public class Test {

    public static void main(String args[]) {

        ArrayList<Student> a = new ArrayList<Student>();
        a.add(new Student("Steve", 12, "Daniel"));
        a.add(new Student("Sachin", 10, "Tendulkar"));

        System.out.println(a);

        display(a);

    }

    static void display(ArrayList<Student> stu) {

        stu.add(new Student("Yuvi", 12, "Bhajji"));

        System.out.println(stu);

    }

}

Student.java:

public class Student {

    public String name;

    public int id;

    public String email;

    Student() {

    }

    Student(String name, int id, String email) {

        this.name = name;
        this.id = id;
        this.email = email;

    }

     public String toString(){           //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
          return name+" "+id+" "+email;     
         }  


    public String getName(){

        return name;
    }

    public void setName(String name){

        this.name=name;
    }

    public int getId(){

        return id;
    }

    public void setId(int id){

        this.id=id;
    }

    public String getEmail(){

        return email;

    }

    public void setEmail(String email){

        this.email=email;
    }
}

Выход:

[Стив 12 Даниил, Сахин 10 Тендулкар]

[Steve 12 Daniel, Sachin 10 Tendulkar, Yuvi 12 Bhajji]

Если вы не используете toString () в классе Pojo (Student.java), вы будете получите выход, например [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]. Чтобы избежать такой проблемы, мы используем метод toString ().

5
ответ дан Naruto 28 August 2018 в 00:07
поделиться

Использование String toString: всякий раз, когда вам требуется исследовать конструктор с именем value в форме String, вы можете просто использовать String toString ... для примера ...

package pack1;

import java.util.*;

class Bank {

    String n;
    String add;
    int an;
    int bal;
    int dep;

    public Bank(String n, String add, int an, int bal) {

        this.add = add;
        this.bal = bal;
        this.an = an;
        this.n = n;

    }

    public String toString() {
        return "Name of the customer.:" + this.n + ",, "
                + "Address of the customer.:" + this.add + ",, " + "A/c no..:"
                + this.an + ",, " + "Balance in A/c..:" + this.bal;
    }
}

public class Demo2 {

    public static void main(String[] args) {

        List<Bank> l = new LinkedList<Bank>();

        Bank b1 = new Bank("naseem1", "Darbhanga,bihar", 123, 1000);
        Bank b2 = new Bank("naseem2", "patna,bihar", 124, 1500);
        Bank b3 = new Bank("naseem3", "madhubani,bihar", 125, 1600);
        Bank b4 = new Bank("naseem4", "samastipur,bihar", 126, 1700);
        Bank b5 = new Bank("naseem5", "muzafferpur,bihar", 127, 1800);
        l.add(b1);
        l.add(b2);
        l.add(b3);
        l.add(b4);
        l.add(b5);
        Iterator<Bank> i = l.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }

}

.. скопируйте эту программу в свое затмение и запустите ее ... вы получите идеи о String toString ...

38
ответ дан Pshemo 28 August 2018 в 00:07
поделиться
/**
 * This toString-Method works for every Class, where you want to display all the fields and its values
 */
public String toString() {

    StringBuffer sb = new StringBuffer();

    Field[] fields = getClass().getDeclaredFields(); //Get all fields incl. private ones

    for (Field field : fields){

        try {

            field.setAccessible(true);
            String key=field.getName();
            String value;

            try{
                value = (String) field.get(this);
            } catch (ClassCastException e){
                value="";
            }

            sb.append(key).append(": ").append(value).append("\n");

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    return sb.toString();
}
0
ответ дан redestructa 28 August 2018 в 00:07
поделиться

toString() преобразует указанный объект в строковое значение.

0
ответ дан Sumit Singh 28 August 2018 в 00:07
поделиться

toString () возвращает строковое / текстовое представление объекта. Обычно используется для диагностических целей, таких как отладка, ведение журнала и т. Д. Метод toString () используется для чтения значимых деталей объекта.

Он автоматически вызывается, когда объект передается println, print, printf, String.format (), assert или оператор конкатенации строк.

Реализация toString () по умолчанию в классе Object возвращает строку, состоящую из имени класса этого объекта, за которым следует знак @ и шестнадцатеричное представление без знака хэш-кода этого объекта, используя следующую логику,

getClass().getName() + "@" + Integer.toHexString(hashCode())

Например, следующий

public final class Coordinates {

    private final double x;
    private final double y;

    public Coordinates(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        Coordinates coordinates = new Coordinates(1, 2);
        System.out.println("Bourne's current location - " + coordinates);
    }
}

печатает

Bourne's current location - Coordinates@addbf1 //concise, but not really useful to the reader

Теперь, переопределяя toString () в классе Coordinates, как показано ниже,

@Override
public String toString() {
    return "(" + x + ", " + y + ")";
}

приводит к

Bourne's current location - (1.0, 2.0) //concise and informative

. Полезность переопределения toString () становится еще больше, когда метод вызывается в коллекциях содержащие ссылки на эти объекты. Например, следующий

public static void main(String[] args) {
    Coordinates bourneLocation = new Coordinates(90, 0);
    Coordinates bondLocation = new Coordinates(45, 90);
    Map<String, Coordinates> locations = new HashMap<String, Coordinates>();
    locations.put("Jason Bourne", bourneLocation);
    locations.put("James Bond", bondLocation);
    System.out.println(locations);
}

вместо

печатает

{James Bond=(45.0, 90.0), Jason Bourne=(90.0, 0.0)}

,

{James Bond=Coordinates@addbf1, Jason Bourne=Coordinates@42e816}

Несколько указателей реализации,

  1. Вы почти всегда должны переопределять метод toString (). . Один из случаев, когда переопределение не требуется, - это классы служебных программ, которые группируют статические методы утилиты в порядке java.util.Math . Случай переопределения, который не требуется, довольно интуитивно понятен; почти всегда вы знаете.
  2. Возвращаемая строка должна быть кратким и информативным, в идеале без объяснения.
  3. По крайней мере, поля, используемые для установления эквивалентности между двумя разными объектами, т.е. полями используемый в реализации метода equals () , должен быть выплёвлен методом toString ().
  4. Предоставить аксессуаров / геттеров для всех полей экземпляра, которые содержатся в возвращаемой строке , Например, в классе «Координаты»
    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }
    

Полный охват метода toString () приведен в 10-м номере книги «Эффективное Java ™, второе издание» Джоша Блоха.

12
ответ дан sxnamit 28 August 2018 в 00:07
поделиться

Всякий раз, когда вы получаете доступ к объекту (не являющемуся String) в контексте String, то toString () вызывается под обложками компилятором.

Вот почему

Map map = new HashMap();
System.out.println("map=" + map);

, и переопределяя стандарт toString () из Object в ваших собственных классах, вы можете сделать ваши объекты полезными и в контекстах String.

(и считайте это черным ящиком! Никогда, никогда не используйте содержание для чего-либо еще, чем представление человеку)

5
ответ дан Thorbjørn Ravn Andersen 28 August 2018 в 00:07
поделиться

Правильно переопределенный метод toString может помочь в регистрации и отладке Java.

4
ответ дан USM167 28 August 2018 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: