Суммирование индекса элементов в arrayylist в java

Итак, у меня есть класс списка книг, в котором я хочу ввести год книги, и программа должна дать мне процент книг с этим годом. Теперь, когда я запускаю свой код, он дает мне последнюю введенную мной книгу, даже не номер. Я не знаю, что не так с моим кодом. Я неправильно ввел код?

Речь идет о созданном мною методе, о котором идет речь.

    public void bookYear(int year) {
    int index = 0;
    for(Inventory listBook : list) {
        if (listBook.getYear() == year) {
            index = list.indexOf(listBook);
            index += index / list.size();
            System.out.println(list.get(index));
        }
    }
}

Это мой класс Inventory

package bookStore;

public class Inventory {

private int isbn;
private String title;
private int year;
private String author;
private double price;

public Inventory() {
    this.isbn = 0;
    this.title = "";
    this.year = 0;
    this.author = "";
    this.price = 0.0;
}

public Inventory(int isbn, 
        String title,
            int year, 
            String author, 
            double price) {
    this.isbn = isbn;
    this.title = title;
    this.year = year;
    this.author = author;
    this.price = price;
}

//Getters
public int getIsbn() {
    return this.isbn;
}
public String getTitle() {
    return this.title;
}
public int getYear() {
    return this.year;
}
public double getPrice() {
    return this.price;
}
public String getAuthor() {
    return this.author;
}

//Setters
public void setIsbn(int isbn) {
    this.isbn = isbn;
}
public void setTitle(String title) {
    this.title = title;
}
public void setYear(int year) {
    this.year = year;
}
public void setAuthor(String author) {
    this.author = author;
}
public void setPrice(double price) {
    this.price = price;
}

public String toString() {
    return ("ISBN: " + isbn + "\t" 
            + "Title: " + title + "\t"
            + "Year: " + year + "\t"
            + "Author: " + author + "\t"
            + "Price: " + price);
 }  
}

Это мой класс InventoryList (где, я думаю, моя проблема)

package bookStore;

import java.util.ArrayList;

public class InventoryList {

int isbn = 0;
String title = "";
int year = 0;
String author = "";
double price = 0.0;

ArrayList<Inventory>list = new ArrayList<Inventory>();



//adding new books
public void addBook(int isbn, String title, 
        int year, String author, double price) {
        list.add(new Inventory(isbn, title, year, 
                    author, price));
}

//delete a book using its ISBN number
public void delete(int isbn) {
    int index = 0;
    for(Inventory listBook : list) {
        if (listBook.getIsbn() == isbn) {
            index = list.indexOf(listBook);
        }
    }
    list.remove(index);
}

//Searches for a book
public void searchBook(int isbn) {
    int index = 0;
    for(Inventory listBook : list) {
        if (listBook.getIsbn() == isbn) {
            index = list.indexOf(listBook);
            System.out.println(list.get(index));
        }
    }
}

//print out books of year chosen by user
public void bookYear(int year) {
    int index = 0;
    for(Inventory listBook : list) {
        if (listBook.getYear() == year) {
            index = list.indexOf(listBook);
            index += index / list.size();
            System.out.println(list.get(index));
        }
    }
}

//print out the sum of all books price
public double priceAll(double price) {
    int price1 = 0;
    for(Inventory listBook : list) {
        price1 += listBook.getPrice();
    }
    return price1;
}

//print out all books
public void listBooks(int isbn, String title, int year, 
        String author, double price) {

    for(Inventory listBook : list) {
        System.out.println(listBook);
    }
 }
}

Это мой класс InventoryClient

package bookStore;

import java.util.Scanner;

public class InventoryClient {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int isbn = 0;
    String title = "";
    int year = 0;
    String author = "";
    double price = 0.0;
    int menu = 0;
    int isbn2 = 0;
    int isbn3 = 0;

    InventoryList book = new InventoryList();
    Scanner scan = new Scanner(System.in);

    do {
        System.out.println("\n1 - New Book");
        System.out.println("2 - Books By Year");
        System.out.println("3 - Total of Inventory Price");
        System.out.println("4 - Search Book");
        System.out.println("5 - Erase Book");
        System.out.println("6 - List of All Books");
        System.out.println("7 - Exit");
        System.out.print("\nEnter Number from Menu: ");
        menu = scan.nextInt();

        if (menu == 1) { //New Book
            System.out.print("Enter ISBN: ");
            isbn = scan.nextInt();
            System.out.print("Enter Title: ");
            title = scan.next();
            System.out.print("Enter Year: ");
            year = scan.nextInt();
            System.out.print("Enter Author: ");
            author = scan.next();
            System.out.print("Enter Price: ");
            price = scan.nextDouble();
            book.addBook(isbn, title, year, author, price);
        }
        if (menu == 2) { //Books by year
            System.out.println("Enter year: ");
            int year2 = scan.nextInt();
            book.bookYear(year);
        }
        if (menu == 3) { //Inventory Price   
            System.out.println(book.priceAll(price));
        }
        if (menu == 4) { //Search Book
            System.out.println("Enter ISBN of Book you wish to find: ");
            isbn3 = scan.nextInt();
            //System.out.print("The Book is ");
            book.searchBook(isbn3);
        }
        if (menu == 5) { //Erase Book
            System.out.println("Enter ISBN of Book you wish to delete: ");
            isbn2 = scan.nextInt();
            book.delete(isbn2);
            System.out.println("Book Deleted"); 
        }
        if (menu == 6) { //List of Books
            book.listBooks(isbn, title, year, author, price);
        }
    }while(menu != 7);//Exit
        System.out.println("\nGood Bye!");
 }
}

Ну, вы распечатываете элемент List ... это книга. Вы хотели: System.out.println(index);?

GBlodgett 11.12.2018 21:07

Ты не считаешь. indexOf сообщает вам индекс в списке, где существует конкретная книга. Вам нужно подсчитать количество книг, а затем после вы распечатаете количество, разделенное на размер списка.

Abion47 11.12.2018 21:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
929
3

Ответы 3

Ваша логика ошибочна. Вы хотите подсчитать количество книг за год и вычислить процент после цикла, а не внутри цикла. Кроме того, обычно вы хотите вернуть вычисленный результат, чтобы использовать его позже (печать или что-то еще). Попробуйте что-нибудь вроде:

public float bookYear(int year) {
    int count = 0;
    for(Inventory listBook : list) {
        if (listBook.getYear() == year) {
            count++;
        }
    }

   return (float)count / list.size();       
}

Вы могли бы написать такую ​​логику в Java 8 следующим образом:

float prct = 
    list.stream()
        .filter(i -> i.getYear == year)
        .count() 
        / (float) list.size();

Как я уже сказал в своем комментарии, вы используете getIndex, который просто дает вам индекс книги в списке. Чтобы получить процент, вам нужно считать количество книг с соответствующим годом, а затем после цикл, в котором вы делите количество на размер списка:

public void bookYear(int year) {
    int count = 0;
    for (Inventory listBook : list) {
        if (listBook.getYear() == year) {
            count++;
        }
    }
    double percentage = (double)count / list.size() * 100.0;
    System.out.println(percentage);
}

В вашем методе:

public void bookYear(int year) {
    int index = 0;
    for(Inventory listBook : list) {
        if (listBook.getYear() == year) {
            index = list.indexOf(listBook);
            index += index / list.size();
            System.out.println(list.get(index));
        }
    }
}

Вы просто добавляете установку указателя в указатель книги. Обратите внимание, что:

index += index / list.size();

будет выполнять целочисленное деление и всегда будет приводить к нулю, поскольку размер всегда будет больше индекса. Это означает, что вы всегда добавляете 0 к index. Чтобы получить среднее значение, вам нужно посчитать, сколько книг имеет год, а затем разделить его на размер. Так что что-то вроде:

public void bookYear(int year) {
    double index = 0.0;
    for(Inventory listBook : list) {
       if (listBook.getYear() == year) {
           index++;
        }
    }
    System.out.println(index / (double)list.size());
}    

Другие вопросы по теме