sebesseg.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.Locale;               // Tizedesvessző helyett tizedespontot szerenék, ezért kell
  9 
 10 // C++ megoldással analóg megoldás!
 11 public class sebesseg {
 12     public static void main(String args[]) throws IOException {
 13         ArrayList<adat> ADATOK = new ArrayList<>();
 14 
 15         try (BufferedReader FBE = Files.newBufferedReader(Paths.get("ut.txt"), StandardCharsets.UTF_8)) {
 16             // 1. feladat - adatok beolvasása --> CLASS használattal oldjuk meg
 17             // Első sor beolvasása
 18             String sor;
 19             sor = FBE.readLine();
 20             int hossz = Integer.parseInt(sor);
 21             // További sorok beolvasása
 22             while ((sor = FBE.readLine()) != null) {
 23                 sor = sor.trim();
 24 
 25                 if (!sor.isEmpty()) {
 26                     String[] mezok = sor.split("\\s+");
 27                     int tavolsag = Integer.parseInt(mezok[0]);
 28                     String info = mezok[1];
 29                     ADATOK.add(new adat(tavolsag, info));
 30                 }
 31             }
 32             // ---------------------------------------------------------------------------
 33             // 2. Írja ki az úton található települések nevét! Minden település neve új sorban jelenjen meg!
 34             System.out.println("2. feladat");
 35             System.out.println("A telepulesek neve:");
 36             for (adat Adat : ADATOK) {
 37                 if (Adat.info.length() > 3) {
 38                     System.out.println(Adat.info);
 39                 }
 40             }
 41             // ---------------------------------------------------------------------------
 42             // 3. Távolság bekérése: ezen a távon mi volt a legalacsonyabb sebességhatár
 43             System.out.println("3. feladat");
 44             Scanner scanner = new Scanner(System.in);
 45             scanner.useLocale(Locale.US);               // tizedespontra térek át
 46             System.out.print("Adja meg a vizsgalt szakasz hosszat km-ben! ");
 47             double km = scanner.nextDouble();
 48             double meter = km * 1000;
 49             int MINIMUM = 90;
 50             boolean varosban = false;   // 5. feladatban is használjuk
 51             String info;                // 5. és 6. feladatban is használjuk
 52             int S = 0;
 53             for (adat Adat : ADATOK) {
 54                 info = Adat.info;
 55                 if (Adat.tavolsag < meter) {
 56                     int SebessegTabla = csakszamok(info);
 57                     if (SebessegTabla > -1) S = SebessegTabla;       // stoi - string to integer
 58                     if (info.length() > 3) {
 59                         varosban = true;
 60                         S = 50;
 61                     }
 62                     if ("]".equals(Adat.info)) {
 63                         varosban = false;
 64                         S = 90;
 65                     }
 66                     if ("#".equals(Adat.info) || "%".equals(Adat.info)) {
 67                         S = varosban ? 50 : 90;
 68                     }
 69                     if (S < MINIMUM) MINIMUM = S;
 70                 }
 71             }
 72             System.out.printf("Az elso %.2f km-en %d km/h volt a legalacsonyabb megengedett sebesseg.%n", km, MINIMUM);
 73             // ---------------------------------------------------------------------------
 74             // 4. Az út hány %-a vezet városon keresztül?
 75             System.out.println("4. feladat");
 76             int VarosonKeresztul = 0;
 77             int start = 0;                          // 5. és 6. feladatban is használjuk
 78             int vege = 0;                           // 5. és 6. feladatban is használjuk
 79             for (adat Adat: ADATOK) {                
 80                 if (Adat.info.length() > 3) {
 81                     // városba érünk
 82                     start = Adat.tavolsag;
 83                     
 84                 }
 85                 if ("]".equals(Adat.info)) {
 86                     vege = Adat.tavolsag;
 87                     VarosonKeresztul += (vege - start);
 88                 }
 89             }
 90             double Szazalek = ((double) VarosonKeresztul / (double) hossz) * 100;
 91             System.out.printf("Az ut %.2f szazaleka vezet telepulesen belul.%n", Szazalek);
 92             // ---------------------------------------------------------------------------
 93             // 5. Egy adott településen hány korlátozás van, és milyen hossz a település
 94             System.out.println("5. feladat");
 95             System.out.print("Adja meg egy telepules nevet! ");
 96             scanner = new Scanner(System.in);
 97             String VAROS = scanner.nextLine();
 98             int db = 0, VarosHossz = 0;
 99             varosban = false;
100             for (adat Adat : ADATOK) {
101                 info = Adat.info;
102                 if (info.equals(VAROS)) {
103                     start = Adat.tavolsag;
104                     varosban = true;
105                 }
106                 if(csakszamok(info) > -1 && varosban) db++;
107                 if(info.equals("]") && varosban) {
108                     vege = Adat.tavolsag;
109                     break;
110                 }
111             }
112             VarosHossz = vege - start;
113             System.out.printf("A sebessegkorlatozo tablak szama: %d%n", db);
114             System.out.printf("Az ut hossza a telepulesen belul %d meter.%n", VarosHossz);
115             // ---------------------------------------------------------------------------
116             // 6. Az előzőleg megadott településhez legközelebbi település neve
117             System.out.println("6. feladat");
118             ArrayList<varosInfo> VAROSOK = new ArrayList<>();
119             String LegkozelebbiVaros;
120             String varosnev = "";
121             for (adat Adat : ADATOK) {
122                 info = Adat.info;
123                 if(info.length() > 3) {
124                     varosnev = info;
125                     start = Adat.tavolsag;
126                 }
127                 if ("]".equals(info)) {
128                     vege = Adat.tavolsag;
129                     VAROSOK.add(new varosInfo(varosnev, start, vege));
130                 }
131             }
132             int index = 0;
133             varosInfo varosInfok, ElozoVarosInfok, KovetkezoVarosInfok;
134             for (int i = 0; i < VAROSOK.size(); i++) {
135                 varosInfok = VAROSOK.get(i);
136                 if (VAROS.equals(varosInfok.varosNev)) {
137                     index = i;
138                     break;
139                 }
140             }
141             if (index == 0) {
142                 // első várost adtuk meg
143                 varosInfok = VAROSOK.get(index + 1);
144                 LegkozelebbiVaros = varosInfok.varosNev;
145             }
146             else if(index == (VAROSOK.size() - 1)) {
147                 // utolsó várost adtuk meg
148                 varosInfok = VAROSOK.get(index - 1);
149                 LegkozelebbiVaros = varosInfok.varosNev;
150             }
151             else {
152                 // "belső" várost adtunk meg
153                 varosInfok = VAROSOK.get(index);
154                 ElozoVarosInfok = VAROSOK.get(index - 1);
155                 KovetkezoVarosInfok = VAROSOK.get(index + 1);
156                 int elozo = varosInfok.k - ElozoVarosInfok.v;
157                 int kovetkezo = KovetkezoVarosInfok.k - varosInfok.v;
158                 LegkozelebbiVaros = (elozo <= kovetkezo) ? ElozoVarosInfok.varosNev : KovetkezoVarosInfok.varosNev;
159             }
160             System.out.printf("A legkozelebbi telepules: %s%n", LegkozelebbiVaros);
161         }
162         
163         // Beolvasott adatok kiírása
164         // for (adat Adat : ADATOK) {
165         //    System.out.println(Adat);
166         // }
167     }
168     // Saját függvény
169     static int csakszamok(String szoveg) {
170         try {
171             return Integer.parseInt(szoveg.trim());
172         } catch (NumberFormatException e) {
173             return -1;
174         }
175     }
176 }
177 
178 class adat {
179     int tavolsag;
180     String info;
181 
182     adat(int tavolsag, String info) {
183         this.tavolsag = tavolsag;
184         this.info = info;
185     }
186 
187     public String toString() {
188         return tavolsag + " " + info;
189     }
190 }
191 
192 class varosInfo {
193     String varosNev;
194     int k;
195     int v;
196     
197     varosInfo(String varosNev, int k, int v) {
198         this.varosNev = varosNev;
199         this.k = k;
200         this.v = v;
201     }
202     
203     public String toString() {
204         return varosNev + " " + k + " " + v;
205     }
206 }
207 
208