将类的属性/字段与(所有)其他类进行比较

时间:2015-11-10 18:40:42

标签: java

假设我有一个名为Character的{​​{1}}类的属性/字段,它基本上是两个坐标:

position

让我们说我希望角色能够互动,当且仅当他们的位置完全相同时,如下所示:

public class Character {
  int[][] position;

  public Character(int[][] position) {
    this.position = position;
  }
}

如何从该类中获取所有实例化对象的数组,即上面的public void interact() { for character in all_characters { if (this.position = character.position) { // Do something } } }

2 个答案:

答案 0 :(得分:1)

关于获取属性。 如果它不是私有的,它应该是可用的。 在java中,有一种做法是将属性设为私有,并为它们实现公共getter方法。 让我举个例子。

关于比较。

我建议尝试使用deepEquals类的Arrays静态方法。 http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#deepEquals(java.lang.Object[],%20java.lang.Object[])

file Character.java
public class Character {
    private int[][] position;
    public Character(int[][] position) {
        this.position = position;
    }

    public int[][] getPosition() {
        return position;
    }

    }

    file Worker.java
    public class Worker {

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

    // all_characters.add(ch1);
    // all_characters.add(ch2);
    // all_characters.add(chN);

    public void interact() {
        for (chLeft in all_characters) {
            for (chRight in all_characters) {
                if(java.util.Arrays.deepEquals(chLeft.getPosition(), chRight.getPosition())) {
                    // Let's interact :)
                }
        }
    }

    }

答案 1 :(得分:0)

这不是自动完成的。您必须跟踪实体,可能使用接口对它们进行装饰以便能够跟踪这些内容,例如:

class Position
{
  private int[][] data;
  public boolean equals(Position other) { .. }
}

interface Positionable
{
  public Position getPosition();
}

class Character implements Positionable
{
  private Position position;
  @Override public Position getPosition() { return position; }
}

class EntityGroup
{
  List<Positionable> entities;

  public Optional<Positionable> findEntityInSamePosition(Positionable p) {
    return entities.stream().filter(p2 -> !p.equals(p2) && p.getPosition().equals(p2.getPosition())).findfirst();

  }
}