konyvek.java
  1 import java.io.BufferedReader;         // Szövegfájl soronkénti olvasásához
  2 import java.io.IOException;            // Fájlkezelési hibák jelzéséhez; a main ezt továbbadja
  3 import java.nio.charset.StandardCharsets; // Az UTF-8 karakterkódolás megadásához
  4 import java.nio.file.Files;            // Fájl olvasásához szükséges eszközök
  5 import java.nio.file.Paths;            // Fájl elérési útjának megadásához
  6 import java.util.ArrayList;            // Rugalmas méretű listák használatához
  7 import java.util.Scanner;              // Input műveletekhez
  8 import java.util.Comparator;           // Rendezéshez az elemek összehasonlításához
  9 import java.util.HashSet;              // Halmaz megvalósításához
 10 import java.util.Set;                  // Halmaz típushoz "interfész"
 11 
 12 // C++ megoldással analóg megoldás!
 13 public class konyvek {
 14     public static void main(String args[]) throws IOException {
 15         ArrayList<kiadas> KONYVEK = new ArrayList<>();
 16 
 17         try (BufferedReader FBE = Files.newBufferedReader(Paths.get("kiadas2.txt"), StandardCharsets.UTF_8)) {
 18             // 1. Adatok beolvasása --> CLASS használattal oldjuk meg
 19             String sor;
 20             while ((sor = FBE.readLine()) != null) {
 21                 sor = sor.trim();
 22                 if (!sor.isEmpty()) {
 23                     String[] mezok = sor.split(";");
 24                     int ev = Integer.parseInt(mezok[0]);
 25                     int negyedev = Integer.parseInt(mezok[1]);
 26                     String eredet = mezok[2];
 27                     String leiras = mezok[3];
 28                     int peldany = Integer.parseInt(mezok[4]);
 29                     KONYVEK.add(new kiadas(ev, negyedev, eredet, leiras, peldany));
 30                 }
 31             }
 32             // ---------------------------------------------------------------------------
 33             // 2. Egy adott szerzőtől hány könyv szerepel az adatok között?
 34             System.out.println("2. feladat:");
 35             System.out.print("Szerzo: ");
 36             Scanner scanner = new Scanner(System.in);
 37             String Szerzo = scanner.nextLine();
 38             int kiadasDb = 0;
 39             for (kiadas Konyv : KONYVEK) {
 40                 if (Konyv.leiras.contains(Szerzo)) kiadasDb++;
 41             }
 42             if (kiadasDb > 0) 
 43                 System.out.printf("%d kiadas%n", kiadasDb);
 44             else
 45                 System.out.println("Nem adtak ki.");
 46             // ---------------------------------------------------------------------------
 47             // 3. A legnagyobb kiadott példányszám, és ez hány könyv kiadása esetén fordult elő
 48             
 49             System.out.println("3. feladat:");
 50             ArrayList<kiadas> RENDEZETT = new ArrayList<>(KONYVEK);
 51             RENDEZETT.sort(Comparator.comparingInt((kiadas k) -> k.peldany).reversed());
 52             int MAXpeldany = RENDEZETT.get(0).peldany;
 53             int index = 1;
 54             while (RENDEZETT.get(index).peldany == MAXpeldany) {
 55                 index++;
 56             }
 57             System.out.printf("Legnagyobb peldanyszam: %d, elofordult %d alkalommal.%n", MAXpeldany, index);
 58             
 59             // ---------------------------------------------------------------------------
 60             // 4. első olyan külföldi szerzőtől származó mű, amely legalább 40 000 példányban jelent meg
 61             //    Tudjuk, hogy volt ilyen könyv (tehát KIVÁLASZTÁS)
 62             System.out.println("4. feladat:");
 63             index = 0;
 64             while (!("kf".equals(KONYVEK.get(index).eredet) && KONYVEK.get(index).peldany >= 40000)) {
 65                 index++;
 66             }
 67             System.out.printf("%d/%d4. %s%n", KONYVEK.get(index).ev, KONYVEK.get(index).negyedev, KONYVEK.get(index).leiras);
 68             // ---------------------------------------------------------------------------
 69             // 5. Készítsen statisztikát az olyan évekről, amelyekben szerepel, hogy hány alkalommal és
 70             //    összesen mekkora példányszámban adtak ki magyar, illetve külföldi könyvet! 
 71             System.out.println("5. feladat:");
 72             int[][] stat = new int[4][4];
 73             int eredetIndex;
 74             int peldanyIndex;
 75             for (kiadas Konyv: KONYVEK) {
 76                 int ev = Konyv.ev - 2020;
 77                 eredetIndex = "ma".equals(Konyv.eredet) ? 0 : 2;
 78                 peldanyIndex = "ma".equals(Konyv.eredet) ? 1 : 3;
 79                 stat[ev][eredetIndex]++;
 80                 stat[ev][peldanyIndex] += Konyv.peldany;                
 81             }              
 82             System.out.println("Ev Magyar kiadas Magyar peldanyszam Kulfuldi kiadas Kulfoldi peldanyszam");
 83             for (int ev = 0; ev < 4; ev++) {
 84                 System.out.printf("%d ", ev + 2020);
 85                 for (int j = 0; j < 4; j++) {
 86                     System.out.printf("%d\t\t\t", stat[ev][j]);
 87                 }
 88                 System.out.println();
 89             }
 90             // ---------------------------------------------------------------------------
 91             // 6. Legalább kétszer, nagyobb példányszámban újra kiadott könyvek:
 92             //    Időrendben vannak az adatok, ezt kihasználjuk...
 93             System.out.println("6. feladat:");
 94             System.out.println("Legalabb ketszer, nagyobb peldanyszamban ujra kiadott konyvek: ");
 95             Set<String> leirasok = new HashSet<>();
 96             int darab;
 97             int peldany_i;
 98             int peldany_k;
 99             String leiras_i;
100             String leiras_k;
101             for (int i = 0; i < KONYVEK.size() - 1; i++) {
102                 leiras_i = KONYVEK.get(i).leiras;
103                 if (!leirasok.contains(leiras_i)) {
104                     leirasok.add(leiras_i);
105                     peldany_i = KONYVEK.get(i).peldany;
106                     darab = 0;
107                     for (int k = i + 1; k < KONYVEK.size(); k++) {
108                         leiras_k = KONYVEK.get(k).leiras;
109                         peldany_k = KONYVEK.get(k).peldany;
110                         if (leiras_i.equals(leiras_k)) {
111                             
112                             if (peldany_k > peldany_i) {
113                                 darab++;
114                             }
115                         }
116                     }                   
117                     if (darab >= 2) {
118                         System.out.println(leiras_i);
119                     }  
120                 }       
121             }
122         }
123     }
124 }
125 
126 class kiadas {
127     int ev;
128     int negyedev;
129     String eredet;
130     String leiras;
131     int peldany;
132 
133     kiadas(int ev, int negyedev, String eredet, String leiras, int peldany) {
134         this.ev = ev;
135         this.negyedev = negyedev;
136         this.eredet = eredet;
137         this.leiras = leiras;
138         this.peldany = peldany;
139     }
140 
141     public String toString() {
142         return ev + ";" + negyedev + ";" + eredet + ";" + leiras + ";" + peldany;
143     }
144 }
145 
146