【问题标题】:How to check if an array contains a certain object?如何检查数组是否包含某个对象?
【发布时间】:2015-04-18 10:58:18
【问题描述】:

您好,我有一个程序,您可以在其中放置瓷砖并破坏瓷砖,然后在您使用放置的瓷砖建造一些东西后,您可以将它们出售以赚钱。 如果至少有一块瓷砖是驾驶舱瓷砖,我只想能够出售这些瓷砖。这是我目前所拥有的:

for(int i = 0; i < play.b.toArray().length;i++){
    if(play.b.get(i).id == 1 ){
        cansell= true;
    }else{
        cansell= false;
    }       
}

b 是一个块数组:
公共静态 ArrayList b = new arrayList(); id 1 是驾驶舱瓷砖。以下是驾驶舱瓷砖供参考:

public class cockpit extends block{

    public cockpit(int x,int y,int rot){
        this.x = x;
        this.y = y;
        this.rotate = rot;
        r = new Rectangle(x - (int)play.camx,y - (int)play.camy,20,20);
        id = 3;
    }

    public void tick(){
        createCollisionRect();

        if(Comp.mr && r.contains(new Point((Comp.mx ) ,(Comp.my) ))){
            remove = true;

        }
        if(remove){
            //play.gui.money +=800;

        }

    }

    public void render(Graphics g){
        Graphics2D g2 = (Graphics2D) g;

        if (rotate == 0) {
            ImageIcon i62 = new ImageIcon("res/tiles/cockpit.png");
            img = i62.getImage();
            g.drawImage(img, x - (int) play.camx, y - (int) play.camy,20,20, null);
        }
        if (rotate == 1) {
            AffineTransform at = AffineTransform.getTranslateInstance(x, y);
            at.rotate(Math.toRadians(90),10,10);

            ImageIcon i62 = new ImageIcon("res/tiles/cockpit.png");
            img = i62.getImage();

            g2.drawImage(img,at, null);
        }
        if (rotate == 2) {
            AffineTransform at = AffineTransform.getTranslateInstance(x, y);
            at.rotate(Math.toRadians(180),10,10);

            ImageIcon i62 = new ImageIcon("res/tiles/cockpit.png");
            img = i62.getImage();

            g2.drawImage(img, at, null);
        }
        if (rotate == 3) {
            AffineTransform at = AffineTransform.getTranslateInstance(x, y);
            at.rotate(Math.toRadians(-90),10,10);

            ImageIcon i62 = new ImageIcon("res/tiles/cockpit.png");
            img = i62.getImage();

            g2.drawImage(img, at, null);

        }
    }
}

这是游戏课(它很大):

公共课播放扩展屏幕{

public Image img, img1;

public static Rectangle r = new Rectangle(0, 200, 1000, 50);

private Image i;

public int turn = 1;

public static player p;
public static gui gui;
public static entitiesManager em;
public static sell s;

public static int camx, camy;

public static ArrayList<block> b = new ArrayList<block>();

public static int selectedRot = 0;
public static int selectedID = 0;
public static int maxSelectedID = 13;

public static int bx, by, w, h;

public static int dragX, dragY, drawWitdh, drawHeight, curX, curY;

public static boolean canPlaceATile = true;

public static boolean loadSave1;
public static boolean loadSave2;
public static boolean loadSave3;

public static boolean dragging;

public boolean hasloaded = false;

public static boolean canplace = true;

public static boolean testingMode = false;

// bankruptcy
public static boolean bankrupt = false;
public static int pos = -200;
public static int time = 0;
public static int timer = 0;

public play(manager m) {
    super(m);
    b.clear();
    hasloaded = false;
    p = new player(Comp.size.width / 2 - 10, Comp.size.height / 2 - 10);
    gui = new gui(Comp.size.width / 2 - 10, 20);
    em = new entitiesManager();
    s = new sell(Comp.size.width / 2 + 50, 20);
    if (b.toArray().length <= 0) {
        play.b.add(new invisible(-1000, -1000, play.selectedRot));
    }
    pos = -400;
}

public void tick() {
    if (hasloaded == false) {
        if (loadSave1) {
            load.loadship1();
            load.loadMoney1();
        }
        if (loadSave2) {
            load.loadship1();
            load.loadMoney1();
            play.gui.money = 10000;
            play.gui.s.HJSshares = 0;
            play.gui.s.MSshares = 0;
            play.gui.s.KSshares = 0;
            play.gui.s.MScost = 100;
            play.gui.s.KScost = 1000;
            play.gui.s.HJScost = 10000;
            play.gui.day = 30;
            play.gui.dividend = 0;
            play.bankrupt = false;
            play.b.clear();
            play.b.add(new invisible(-1000, -1000, play.selectedRot));
            play.selectedID = 1;
            play.selectedRot = 0;

            save.saveMoney1();
            save.saveShip();

        }

        hasloaded = true;
    }

    handleinput();
    s.tick();
    p.tick();
    gui.tick();
    em.tick();

    for (int i = 0; i < b.toArray().length; i++) {
        b.get(i).tick();

        if (b.get(i).remove && !play.testingMode) {
            b.remove(i);
            i--;
        }
    }

    if (selectedRot >= 4) {
        selectedRot = 0;
    }

    if (selectedID > maxSelectedID) {
        selectedID = 0;
    } else if (selectedID < 0) {
        selectedID = maxSelectedID;
    }

    // System.out.println(""+b.toArray().length);

    if (b.toArray().length <= 0) {
        play.b.add(new invisible(-1000, -1000, play.selectedRot));

    }

    if (pos >= -30) {
        pos = -30;
        time = 0;
    }

    if(bankrupt){
        if(time >= timer && pos<= -31){
            pos++;
            time = 0;
        }else {
            time++;
        }
    }
}

public void handleinput() {
    if (Keys.isPressed(Keys.z)) {
        selectedRot++;
    }
    if (Keys.isPressed(Keys.s)) {
            save.saveShip();
            save.saveMoney1();


    }

    if (Keys.isPressed(Keys.ESCAPE)) {
        m.setScreen(manager.menu);
        play.selectedID = 0;
        play.selectedRot = 0;
    }




}

public void render(Graphics g) {

    Graphics2D g2 = (Graphics2D) g;

    RenderingHints rh = new RenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
    g2.setRenderingHints(rh);

    ImageIcon i622 = new ImageIcon("res/bg/universFIN.png");
    img = i622.getImage();
    g.drawImage(img, 0, 0, null);

    p.render(g);
    em.render(g);

    for (int i = 0; i < b.toArray().length; i++) {
        b.get(i).render(g);

    }

    gui.render(g);
    s.render(g);

    bx = Math.min((dragX / 20) * 20, (curX / 20) * 20);
    by = Math.min((dragY / 20) * 20, (curY / 20) * 20);
    w = Math.abs((curX / 20) * 20 - (dragX / 20) * 20);
    h = Math.abs((curY / 20) * 20 - (dragY / 20) * 20);

    if (dragging && w >= 20 && h >= 20 && Comp.ml) {
        g.setColor(new Color(26, 216, 26, 128));
        g.fillRect(bx, by, w, h);
        g.setColor(new Color(17, 142, 17, 255));
        g.drawRect(bx, by, w, h);

    }
    if (dragging && w >= 20 && h >= 20 && Comp.mr) {
        g.setColor(new Color(216, 26, 26, 128));
        g.fillRect(bx, by, w, h);
        g.setColor(new Color(142, 17, 17, 255));
        g.drawRect(bx, by, w, h);

    }


    if (bankrupt) {
        ImageIcon i6221 = new ImageIcon("res/bg/bankrupt.png");
        img = i6221.getImage();
        g.drawImage(img, 0, pos, null);

    }
}

public void init() {

}

}

【问题讨论】:

标签: java arrays


【解决方案1】:

如果您使用的是普通数组,则在其中查找对象的唯一方法是像您一样遍历数组并比较所需的值,或者使用equals()。如果您正在寻找更有效的方法,请查看 HashSet 和其他集合之类的类。

【讨论】:

    【解决方案2】:

    看起来您将块存储在列表中,在这种情况下,惯用的方法是使用 Stream API

    public boolean containsCockpit(List<Block> blocks) {
        return blocks.stream().anyMatch(x -> x.id == 1);
    }
    

    这也适用于块数组:

    public boolean containsCockpit(Block[] blocks) {
        return Arrays.stream(blocks).anyMatch(x -> x.id == 1);
    }
    

    如果您使用的是 Java 7 或更早版本,则必须迭代块:

    public boolean containsCockpit(Block[] blocks) {
        for(Block b : blocks)
            if(b.id == 1)
                return true;
        return false;
    }
    

    【讨论】:

      【解决方案3】:

      试试

      Arrays.binarySearch(intArr,searchVal);

      其中 intArr 是数组的名称,searchVal 是您要搜索的值

      【讨论】:

      • 这在这种情况下不起作用,二分查找仅适用于已排序的集合。
      • 那么我会投入什么来获得价值?
      • 这是 wright Arrays.binarySearch(play.b,play.b.get(i).id)
      • 你为什么要尝试 Arrays.stream(stringArray).forEach ......... 其中 stringArray 是从 b 派生的数组
      猜你喜欢
      • 1970-01-01
      • 2011-04-02
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2014-07-27
      • 2015-01-22
      • 2020-06-07
      相关资源
      最近更新 更多