项目不添加到我的ArrayList或他们不显示

问题描述:

我是编程新手,我可能会问一个愚蠢的问题,但我真的需要帮助。项目不添加到我的ArrayList或他们不显示

我在学习集合是如何工作的,我从ArrayList开始。

我决定做一张纸牌ArrayList,我想在实践中测试添加的方法(显示元素,显示特定元素等)。它不起作用。当我从Arraylist更改为常规数组(Karta[] karty)时,它的工作原理应该如此,因此我知道我在集合中做了某些错误。问题是我不知道是什么因为我刚开始使用colections。

import java.util.ArrayList; 
import java.util.Random; 
import java.util.Scanner; 

public class Main { 
    static ArrayList<Karta> karty = new ArrayList<Karta>(); 
    static Random rand = new Random(); 
    static int wartosc; 
    static int kolor; 

    public static void utworz(){ 
     while(wartosc !=0){ 
      wartosc = rand.nextInt(13); 
      kolor = rand.nextInt(3); 
      Karta karta = new Karta(wartosc, kolor); 
      karty.add(karty.size()-1,karta); 
     } 
    } 

    public static void wyswietl(){ 
     for(int i=0; i<karty.size();i++) 
      System.out.println(karty.toString()); 
     } 

    public static int wyswietlIlosc(){ 
     return karty.size(); 
    } 

    public static void wyswietlOWartosci(int w){ 
     for(Karta k: karty){ 
      if(k.wartosc == w){ 
       System.out.println(k.toString()); 
      } 
     } 
    } 

    public static void wyswietlOKolorze(int kl){ 
     for(Karta k: karty){ 
      if(k.kolor == kl){ 
       System.out.println(k.toString()); 
      } 
     } 
    } 

    public static void main(String[] args){ 
     int wybor =-1; 
     Scanner sc = new Scanner(System.in); 
     int wartosc; 
     int kolor; 
     System.out.println("Wybierz co chcesz zrobic:\n0. Zakoncz dzialanie programu\n1. Utworz nowa liste kart\n2. Wyswietl obecna liste kart\n3. Wyswietl liczbe kart w obecnej liscie\n4. Wyswietl karty z listy o podanej wartosci\n5. Wyswietl karty o podanym kolorze"); 
     while(wybor !=0) { 
      wybor = sc.nextInt(); 
      switch (wybor) { 
       case 1: 
        utworz(); 
        System.out.println("Utworzono"); 
        break; 
       case 2: 
        wyswietl(); 
        break; 
       case 3: 
        wyswietlIlosc(); 
        break; 
       case 4: 
        System.out.println("Podaj wartosc (1 - as, 13 - krol): "); 
        wartosc = sc.nextInt(); 
        wyswietlOWartosci(wartosc); 
        break; 
       case 5: 
        System.out.println("Podaj kolor (0 - kier 1 - karo 2 - trefl 3 - pik): "); 
        kolor = sc.nextInt(); 
        wyswietlOKolorze(kolor); 
        break; 
       default: 
        utworz(); 
        break; 
      } 
     } 
    } 
} 

没有任何反应,当我尝试看看的ArrayList

+5

你可能想养成写“英文”代码的习惯。它适用于这种情况。我不能轻易说出各种方法应该做什么,因此很难发现问题。 – domsson

+0

'while(wartosc!= 0){'你永远不会初始化'wartosc'到任何值,所以我不确定这应该如何工作(或者它如何能够适用于你的数组情况) – UnholySheep

元素当你的列表是空的(所以开头)您要添加的-1指数这里

karty.add(karty.size()-1,karta); 
Karta对象

哪个不行。只需使用

karty.add(karta); 

而且是用英语名称变量/类型/好习惯...... - 当然它不会改变你的应用程序逻辑,但会在的情况下,更具有可读性与其他程序员共享代码


编辑

由于UnholeSheep在下面的注释中说明add方法应尝试在<0索引上添加值时发生异常,但由于值为wartosc变量,您的代码永远无法到达此行 - 它正在初始化为0,并且因为您没有将它设置为任何值1的情况下,它没有初始化你的数组。

您需要修复,这也

+0

这绝对是一个问题,但它不应该抛出'IndexOutOfBoundsException'? - 根据OP的代码运行,但只是没有显示任何'ArrayList'打印时 – UnholySheep

+0

@UnholySheep - 正确 - 我编辑了我的答案 –

+0

这是 karty.add(karta); 更早但它did not; t工作要么 我已经改变了我的wyswietlIlosc() 公共静态无效wyswietlIlosc(){ System.out.println(karty.size()); 现在,而不是什么,它返回0.我现在不是为什么卡没有添加到ArrayList – Szouter

你写在你的static int wartosc;类。你自己不初始化的静态int变量将有0值。在这种情况下,您的public static void utworz()方法将永远不会执行任何操作,因为符合条件while(wartosc !=0)

但即使使用正常的数组,它也不应该工作,所以也许你重写了你的代码,并且它不管用于数组还是列表。

另一件事,在第二个答案karty.add(karty.size()-1,karta);中提到 - 您应该将其更改为以避免在空列表中引发异常。