Элемент Java Modify в списке

avatar
James Connigan
8 августа 2021 в 15:49
114
1
2

Я новичок в 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

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)

Как упоминалось Луи Вассерманом и Траяном 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]

Пожалуйста, см. скриншот ниже.

enter image description here

Источник
Louis Wasserman
8 августа 2021 в 15:54
1

Вы ищете list.get(5).setAvailable(false);?

Traian GEICU
8 августа 2021 в 16:04
0

list.set(5, false); следует вызывать как экземпляр Media. list.set(5, new Media("name" ... , false). Теперь подумайте, что более выгодно использовать replace and Object with new one только для обновления одного поля или, может быть, использовать get для извлечения объекта и просто обновления поля.

James Connigan
8 августа 2021 в 16:13
0

@LouisWasserman, я внес правку в OP, я пытался опубликовать комментарий, но это не имело никакого смысла. Спасибо

Traian GEICU
8 августа 2021 в 16:29
0

В арендованных носителях вы должны обновить с соответствующим идентификатором: list.get(id).setAvailable(false); также setAvailable следует поместить на Media. (относится к текущей записи). В основном, даже если не рекомендуется обновлять поля напрямую, вы также можете проверить с помощью list.get(id).available =false (предположим, что поле общедоступно)

Traian GEICU
8 августа 2021 в 16:37
0

также в list.get(id) должно отражаться положение, сохраненное в List, а не id of Media. Таким образом, вы можете попробовать с mediaById.setAvailable(false); (размещается непосредственно в нужном элементе списка)

rzwitserloot
8 августа 2021 в 16:39
1

Ваш метод setAvailable не работает: он полностью игнорирует свой аргумент, всегда устанавливает доступное значение false независимо от аргумента, а затем по какой-то странной причине возвращает false. Вам просто нужно this.available = available;.

Ответы (1)

avatar
Traian GEICU
8 августа 2021 в 16:50
1

Возможно, это может быть полезно.

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]