【问题标题】:Comparing two ArrayList's [duplicate]比较两个 ArrayList 的 [重复]
【发布时间】:2021-06-04 23:02:52
【问题描述】:

我正在做一个学校作业,我必须检查 ArrayList teKoop 中的某些对象是否不在 ArrayList mijnGames 中,问题是我不断收到此错误代码: 索引 1 超出长度 1 的范围

这里有什么明显的问题吗?

任何帮助将不胜感激。

public ArrayList<Game> bepaalGamesNietInBezit(ArrayList<Game> teKoop) {
    ArrayList<Game> nogNietInBezit = new ArrayList<Game>();
    for (int i = 0; i <= mijnGames.size(); i++) {
        if (!mijnGames.get(i).getNaam().equals(teKoop.get(i).getNaam())) {
            nogNietInBezit.add(teKoop.get(i));
            return nogNietInBezit;

            }
        }
        return nogNietInBezit;

}

所以 indexOutOfBound 错误得到修复,新问题出现:S

它总是返回一个空的 ArrayList:

    private String naam;
    private int releaseJaar;
    private double nieuwprijs;
    private int ditJaar = LocalDate.now().getYear();```


    public Game(String nm, int rJ, double nwpr){
        this.naam = nm;
        this.releaseJaar = rJ;
        this.nieuwprijs = nwpr;

    }

    public String getNaam(){
        return naam;
    }

    public int getReleaseJaar(){
        return releaseJaar;
    }

    public double huidigeWaarde(){
        int jaarVerschil = ditJaar - releaseJaar;
        double nieuweWaarde = nieuwprijs;
        for (int i = 0; i < jaarVerschil; i++){
            nieuweWaarde = nieuweWaarde * 0.7;
        }
        return nieuweWaarde;
    }

    @Override
    public boolean equals(Object andereObject){
        boolean gelijkeObjecten = false;
        if (andereObject instanceof Game) {
            if (((Game) andereObject).getNaam().equals(naam) && ((Game) andereObject).getReleaseJaar() == releaseJaar){
                gelijkeObjecten = true;
            }
        }
        else {
            gelijkeObjecten = false;
        }
        return gelijkeObjecten;
    }


    @Override
    public String toString() {
        return String.format(naam + ", uitgegeven in " + releaseJaar + "; nieuwprijs: €%.2f nu voor: €%.2f", nieuwprijs, huidigeWaarde());
    }
}

```public class Persoon {
    private String naam;
    private double budget;
    private ArrayList<Game> mijnGames;```

    public Persoon(String nm, double bud) {
        this.naam = nm;
        this.budget = bud;
        mijnGames = new ArrayList<>();
    }

    public double getBudget() {
        return budget;
    }


    public boolean koop(Game nm){
        if (!mijnGames.contains(nm) && budget >= nm.huidigeWaarde()){
            mijnGames.add(nm);
            budget = budget - nm.huidigeWaarde();
            return true;
        }

        if (mijnGames.contains(nm) && budget < nm.huidigeWaarde()){
            System.out.println("Er is helaas iets verkeerd gegaan");
            return false;
        }

        if (mijnGames.contains(nm)){
            System.out.println("Je hebt deze game al :)");
            return false;
        }

        if (budget < nm.huidigeWaarde()){
            System.out.println("Helaas heb je niet genoeg budget voor deze game :(");
            return false;
        }

        else {
            return false;
        }

    }

    public boolean verkoop(Game g, Persoon koper){
        if (mijnGames.contains(g) && koper.budget >= g.huidigeWaarde() && !koper.mijnGames.contains(g)){
            budget = budget + g.huidigeWaarde();
            koper.budget = koper.budget - g.huidigeWaarde();
            mijnGames.remove(g);
            koper.mijnGames.add(g);
            return true;
        }
        else {
            return false;
        }
    }

    public Game zoekGameOpNaam(String nm){
        if (mijnGames.size() > 0){
            for (Game game: mijnGames){
                if (game.getNaam().equals(nm)){
                    return game;
                }
            }
        }

        return null;
    }
    

    @Override
    public String toString() {
        if (mijnGames.isEmpty()){
            return String.format(naam + " heeft een budget van " + "€%.2f" + " en bezit de volgende games:", budget);
        }
        else return String.format(naam + " heeft een budget van " + "€%.2f" + " en bezit de volgende games:\n" + mijnGames.toString().replace("[", "").replace("]", ""), budget);
    }

    public ArrayList<Game> bepaalGamesNietInBezit(ArrayList<Game> teKoop) {
        ArrayList<Game> nogNietInBezit = new ArrayList<Game>();
        for (int i = 0; i < mijnGames.size(); i++) {
            if (!mijnGames.contains(teKoop.get(i))) {
                nogNietInBezit.add(teKoop.get(i));
                return nogNietInBezit;
            }

        }
            return nogNietInBezit;

    }
}


public class Main {

    public static void main(String[] args) {
        int releaseJaar1 = LocalDate.now().getYear() - 1; // 1 jaar geleden

        Game g1 = new Game("Just Cause 3", releaseJaar1, 49.98);
        Game g2 = new Game("Need for Speed: Rivals", releaseJaar1, 45.99);
        Game g3 = new Game("Need for Speed: Rivals", releaseJaar1, 45.99);

        Persoon p1 = new Persoon("Eric", 200);
        Persoon p2 = new Persoon("Hans", 55);



        System.out.println("p1 koopt g1:" + (p1.koop(g1) ? "" : " niet") + " gelukt");
        System.out.println("p1 koopt g2:" + (p1.koop(g2) ? "" : " niet") + " gelukt");
        System.out.println("p1 koopt g3:" + (p1.koop(g3) ? "" : " niet") + " gelukt");
        System.out.println("\np1: " +p1+ "\n\np2: " +p2+ "\n");


        System.out.println("p1 verkoopt g2 aan p2:"+(p1.verkoop(g2, p2) ? "" : " niet")+" gelukt");
        System.out.println("p1 verkoopt g1 aan p2:"+(p1.verkoop(g1, p2) ? "" : " niet")+" gelukt");
        System.out.println("\np1: " +p1+ "\n\np2: " +p2+ "\n");

        Game game1 = p1.zoekGameOpNaam("Just Cause 3");
        System.out.println("p1 heeft Just Cause 3 " + (game1 != null ? "wel!" : "niet!"));

        ArrayList<Game> teKoop = new ArrayList<Game>();
        teKoop.add(g1);
        teKoop.add(new Game("Mario Kart 8", 2019, 35.00));
        ArrayList<Game> nogNietInBezit = p1.bepaalGamesNietInBezit(teKoop);
        System.out.println("p1 heeft de volgende games nog niet: " + nogNietInBezit.toString());


    }
}

I apolagise in advance for the code spam, but i have been working on this issue for 4 hours now.


【问题讨论】:

  • 尝试使用 for (int i = 0; i
  • 再次阅读问题。错误是因为基于 0 的索引,所以您需要

标签: java object oop arraylist


【解决方案1】:

for (int i = 0; i &lt;= 5 i++) {}

通过它。这将为以下每个循环一次:0、1、2、3、4、5。数数。那是...... 6个循环。不是 5。那是因为我们从 0 开始计数。所以,如果 mijnGames.size() 返回 1,那将导致循环运行 两次:一次通过,i 将是 0,另一次通过, i 将是 1。

出于同样的原因,如果您在其上调用 .get(0),则其中包含 1 项的列表将为您提供一项,如果您在其上调用 .get(1),则会抛出 IndexOutOfBoundsException,因为 .get(1) 获取second 项,并且此列表中没有该项。

许多编程语言和库采用的两个重要格言,java 和几乎每个为 java 制作的库也采用:

  • 从 0 开始
  • 范围以“开始”和“结束”(而不是“结束 - 1”或其他)的形式表示
  • 范围的开始包括在内。
  • 范围的结尾是独占的。
  • 范围的大小是“结束 - 开始”。

看看它如何应用于数组列表:

  • 它们从 0 开始
  • 在索引上构建循环的常用方法是:for (int i = 0; i &lt; list.size(); i++)
  • 开头包含:i = 0。
  • 结尾是排他性的:使用&lt; 而不是&lt;=,这就是你的 sn-p 出了什么问题。
  • 在将&lt;= 替换为&lt; 之后,我们已经遵守了所有基本规则,因此,我们所涵盖的大小只是结束开始,所以list.size() - 0,所以: 对于每个元素循环一次名单。这正是我们想要的。

【讨论】:

    【解决方案2】:

    索引从零开始。这意味着如果您有一个包含十个元素的列表,它们的索引将是 0 - 9 (含)。 for 循环声明为 for (int i = 0; i &lt;= mijnGames.size(); i++)。 for 循环使用三个子句,即 init 子句 (i = 0)、条件 (i &lt;= mijnGames.size()) 和每次迭代结束时的更新 (i++)。

    简单的英语意思是

    从 0 开始计数,直到并包括列表的大小(元素的数量)。然而,由于索引是从 0 开始的,因此程序会因出现越界异常而崩溃。

    您可以通过将 for 循环声明中的条件修改为

    来解决此问题
    for (int i = 0; i < mijnGames.size(); i++)
    

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2013-01-15
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      相关资源
      最近更新 更多