Java 修改列表中的元素
Java Modify element in list
我是 Java 的新手,如果我使用的术语不正确,我深表歉意。
从文本文件加载列表
static List<Media> list=new ArrayList<>();;
public boolean LoadMedia(String path) {
try {
File myObj = new File(path);
Scanner myReader = new Scanner(myObj);
while (myReader.hasNextLine()) {
String data = myReader.nextLine();
String[] str = data.split("-");
if (str[0].equals("EBook")) {
list.add(new EBook(str[0], Integer.parseInt(str[1]), str[2], Integer.parseInt(str[3]), str[4], Boolean.parseBoolean(str[5])));
} else if (str[0].equals("MusicCD")) {
list.add(new MusicCD(str[0], Integer.parseInt(str[1]), str[2], Integer.parseInt(str[3]), str[4], Boolean.parseBoolean(str[5])));
} else if(str[0].equals("MovieDVD")) {
list.add(new MovieDVD(str[0], Integer.parseInt(str[1]), str[2], Integer.parseInt(str[3]), str[4], Boolean.parseBoolean(str[5])));
}
}
我在一个名为 media
的 class 中有一个构造函数
public Media(String name, int id, String title, int year, String chapter, boolean available) {
this.name = name;
this.id = id;
this.title = title;
this.year = year;
this.chapter = chapter;
this.available = available;
}
这将输出到一个字符串
@Override
public String toString() {
return name + " [id=" + this.id + " title=" + this.title + " chapters=" + this.chapter + " year=" + this.year + " available=" + this.available + "]\n";
}
当用户租用物品时:
public void rentMedia(int id) {
for(Media mediaById : list ) {
if(mediaById.getId()==id) {
if(mediaById.isAvailable()) {
System.out.println("media successfully rented out ");
// some code here to update Boolean from true to false
} else {
System.out.println("Media with id="+id+" is not available for rent ");
}
}
}
}
再次加载输出时,我希望输出现在显示为 false
我已经累了 list.set 但是出现以下错误:
list.set(5, false);
The method set(int, Media) in the type List<Media> is not applicable for the arguments (int, boolean)
如 Louis Wasserman 和 Traian GEICU 所述
list.get(5).setAvailable(false);
要求我创建一个 setAvailable 见下文
public void rentMedia(int id) {
for(Media mediaById : list ) {
if(mediaById.getId()==id) {
if(mediaById.isAvailable()) {
System.out.println("media successfully rented out ");
System.out.print(mediaById.toString());
list.get(5).setAvailable(false);
} else {
System.out.println("Media with id="+id+" is not available for rent ");
}
}
}
}
public boolean setAvailable(boolean b) {
available = false;
return available;
}
其中抛出错误
EBook [id=121 title=Shadow and Bone chapters=20 year=2012 available=true]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 5 out of bounds for length 2
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:359)
at java.base/java.util.ArrayList.get(ArrayList.java:427)
at Manager.rentMedia(Manager.java:82)
at FinalProject.main(FinalProject.java:91)
将索引设置为低于 2 仍然没有将 true 更改为 false,不是那样,但我希望看到的是其中一个索引更改为 false 或出现错误。
list.get(1).setAvailable(false);
输出:
Enter media id :
121
media successfully rented out
EBook [id=121 title=Shadow and Bone chapters=20 year=2012 available=true]
请看下面的屏幕截图。
也许这会有所帮助。
class TestUpdate{
public static void main(String[] args)
{
List<Media> l = new ArrayList<Media>();
l.add(new Media("name", 10, "t1",2020,"C1", true));
l.add(new Media("name", 20, "t2",2021,"C2", true));
updateAvailable(l, 10);
l.forEach(System.out::println);
//update directly on list index 1 _ id=20
l.get(1).available = false;
l.forEach(System.out::println);
}
public static void updateAvailable(List<Media> list,int id)
{
for(Media media:list)
{
if(media.getId()==id)
{
media.setAvailable(false);
}
}
}
static class Media
{
private String name;
private int id;
private String title;
private int year;
private String chapter;
public boolean available;
public Media(String name, int id, String title, int year,
String chapter, boolean available) {
this.name = name;
this.id = id;
this.title = title;
this.year = year;
this.chapter = chapter;
this.available = available;
}
public boolean isAvailable() {
return available;
}
public void setAvailable(boolean available) {
this.available = available;
}
public int getId() {
return id;
}
@Override
public String toString() {
return name + " [id=" + this.id + " title=" + this.title +
" chapters=" + this.chapter + " year=" + this.year +
" available=" + this.available + "]\n";
}
}
}
输出
name [id=10 title=t1 chapters=C1 year=2020 available=false]
name [id=20 title=t2 chapters=C2 year=2021 available=true]
name [id=10 title=t1 chapters=C1 year=2020 available=false]
name [id=20 title=t2 chapters=C2 year=2021 available=false]
我是 Java 的新手,如果我使用的术语不正确,我深表歉意。
从文本文件加载列表
static List<Media> list=new ArrayList<>();;
public boolean LoadMedia(String path) {
try {
File myObj = new File(path);
Scanner myReader = new Scanner(myObj);
while (myReader.hasNextLine()) {
String data = myReader.nextLine();
String[] str = data.split("-");
if (str[0].equals("EBook")) {
list.add(new EBook(str[0], Integer.parseInt(str[1]), str[2], Integer.parseInt(str[3]), str[4], Boolean.parseBoolean(str[5])));
} else if (str[0].equals("MusicCD")) {
list.add(new MusicCD(str[0], Integer.parseInt(str[1]), str[2], Integer.parseInt(str[3]), str[4], Boolean.parseBoolean(str[5])));
} else if(str[0].equals("MovieDVD")) {
list.add(new MovieDVD(str[0], Integer.parseInt(str[1]), str[2], Integer.parseInt(str[3]), str[4], Boolean.parseBoolean(str[5])));
}
}
我在一个名为 media
的 class 中有一个构造函数public Media(String name, int id, String title, int year, String chapter, boolean available) {
this.name = name;
this.id = id;
this.title = title;
this.year = year;
this.chapter = chapter;
this.available = available;
}
这将输出到一个字符串
@Override
public String toString() {
return name + " [id=" + this.id + " title=" + this.title + " chapters=" + this.chapter + " year=" + this.year + " available=" + this.available + "]\n";
}
当用户租用物品时:
public void rentMedia(int id) {
for(Media mediaById : list ) {
if(mediaById.getId()==id) {
if(mediaById.isAvailable()) {
System.out.println("media successfully rented out ");
// some code here to update Boolean from true to false
} else {
System.out.println("Media with id="+id+" is not available for rent ");
}
}
}
}
再次加载输出时,我希望输出现在显示为 false
我已经累了 list.set 但是出现以下错误:
list.set(5, false);
The method set(int, Media) in the type List<Media> is not applicable for the arguments (int, boolean)
如 Louis Wasserman 和 Traian GEICU 所述
list.get(5).setAvailable(false);
要求我创建一个 setAvailable 见下文
public void rentMedia(int id) {
for(Media mediaById : list ) {
if(mediaById.getId()==id) {
if(mediaById.isAvailable()) {
System.out.println("media successfully rented out ");
System.out.print(mediaById.toString());
list.get(5).setAvailable(false);
} else {
System.out.println("Media with id="+id+" is not available for rent ");
}
}
}
}
public boolean setAvailable(boolean b) {
available = false;
return available;
}
其中抛出错误
EBook [id=121 title=Shadow and Bone chapters=20 year=2012 available=true]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 5 out of bounds for length 2
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:359)
at java.base/java.util.ArrayList.get(ArrayList.java:427)
at Manager.rentMedia(Manager.java:82)
at FinalProject.main(FinalProject.java:91)
将索引设置为低于 2 仍然没有将 true 更改为 false,不是那样,但我希望看到的是其中一个索引更改为 false 或出现错误。
list.get(1).setAvailable(false);
输出:
Enter media id :
121
media successfully rented out
EBook [id=121 title=Shadow and Bone chapters=20 year=2012 available=true]
请看下面的屏幕截图。
也许这会有所帮助。
class TestUpdate{
public static void main(String[] args)
{
List<Media> l = new ArrayList<Media>();
l.add(new Media("name", 10, "t1",2020,"C1", true));
l.add(new Media("name", 20, "t2",2021,"C2", true));
updateAvailable(l, 10);
l.forEach(System.out::println);
//update directly on list index 1 _ id=20
l.get(1).available = false;
l.forEach(System.out::println);
}
public static void updateAvailable(List<Media> list,int id)
{
for(Media media:list)
{
if(media.getId()==id)
{
media.setAvailable(false);
}
}
}
static class Media
{
private String name;
private int id;
private String title;
private int year;
private String chapter;
public boolean available;
public Media(String name, int id, String title, int year,
String chapter, boolean available) {
this.name = name;
this.id = id;
this.title = title;
this.year = year;
this.chapter = chapter;
this.available = available;
}
public boolean isAvailable() {
return available;
}
public void setAvailable(boolean available) {
this.available = available;
}
public int getId() {
return id;
}
@Override
public String toString() {
return name + " [id=" + this.id + " title=" + this.title +
" chapters=" + this.chapter + " year=" + this.year +
" available=" + this.available + "]\n";
}
}
}
输出
name [id=10 title=t1 chapters=C1 year=2020 available=false]
name [id=20 title=t2 chapters=C2 year=2021 available=true]
name [id=10 title=t1 chapters=C1 year=2020 available=false]
name [id=20 title=t2 chapters=C2 year=2021 available=false]