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]