我是编程新手,我可能会问一个愚蠢的问题,但我真的需要帮助。
我正在学习集合是如何工作的,我从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
答案 0 :(得分:5)
当您的列表为空时(在开头),您尝试在Karta
索引处添加-1
对象
karty.add(karty.size()-1,karta);
哪个不行。只需使用
karty.add(karta);
对于变量/类型/ ...使用英语名称也是一个好习惯 - 当然它不会改变您的应用程序逻辑,但在共享您的应用程序逻辑时会更具可读性代码与其他程序员
修改强>
正如add
中所述,<0
方法在尝试在wartosc
索引上添加值时会引发异常,但由于{{1}的值,您的代码永远不会到达此行变量 - 它被初始化为0,因为在1
的情况下你没有将它设置为任何值而它没有初始化你的数组。
您还需要解决此问题
答案 1 :(得分:0)
你在课堂上写static int wartosc;
。您没有自己初始化的静态int变量将具有0
值。在这种情况下,您的public static void utworz()
方法将始终无效,因为条件while(wartosc !=0)
已得到满足。
但即使使用普通数组它也不应该工作,所以也许你重写代码,无论数组还是列表都不行。
在第二个答案karty.add(karty.size()-1,karta);
中提到的另一件事 - 您应该将其更改为karty.add(karta)
以避免在空列表中引发异常。