Почему происходят ошибки "Cannot find symbol" и "incompatible types" при работе с коллекциями?
Уже не первый раз сталкиваюсь с проблемой, что компилятор почему-то не видит методы, работающие с коллекциями (по крайней мере с ArrayList
).
Вот и здесь он мне выдает:
cannot find symbol method maxPopSearcher()
Но такой метод существует, и он публичный.
Но в моём коде происходит ещё одна ошибка:
cannot find symbol method get(int)
Еще выдает ошибку incompatible types
. Я понимаю, что это несовместимость типов, но откуда там взялся тип CAP#1
? По поиску необнаружения методов коллекций ничего не нашел. Спасибо.
Вот мой код:
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.zip.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Comparator;
public class CitiesPrinter {
public static void main(String[] args) throws IOException {
final String archive = "/storage/emulated/0/Documents/Jvdroid/single-files/_данные_Сбер_Java_20210407090226.zip";
// unzip(archive);
final String unzippedFile = "/storage/emulated/0/Documents/Jvdroid/single-files/city_ru.csv";
Path path = Paths.get(unzippedFile);
Scanner scanner = new Scanner(path);
var fileToZip = new File("/storage/emulated/0/Documents/Jvdroid/single-files/CitiesPrinter");
try (
var fos = new FileOutputStream(fileToZip.getAbsolutePath() + ".zip");
var zipOut = new ZipOutputStream(fos)
) {
zipFile(fileToZip, fileToZip.getName(), zipOut);
}
List<City> cityList = new ArrayList<>();
readFile(path, unzippedFile, cityList);
Comparator<City> comp1 = new Comparator<>() { // добавил первую сортировку с анонимным классом для неучета регистра
@Override
public int compare(City a, City b){
return a.getName().compareToIgnoreCase(b.getName());
}
};
cityList.sort(comp1);
System.out.println("Сортировка по наименованию:\n" + cityList.toString());
Comparator<City> comp2 = new CityDistrictComparator().thenComparing(new CityNameComparator());
cityList.sort(comp2);
System.out.println("\n\n\n\nСортировка по федеральному округу и наименованию:\n" + cityList.toString()); // добавил разделительное сообщение
System.out.println("Город с максимальным количеством жителей:\n" + cityList.maxPopSearcher().toString());
}
public static List readFile(Path p, String file, List cities) throws IOException {
Scanner sc = new Scanner(p);
sc = new Scanner(Paths.get(file));
sc.useDelimiter(System.getProperty("line.separator"));
while(sc.hasNext()) {
City city = parseCSVLine1(sc.next());
// System.out.println(city.toString());
cities.add(city);
}
sc.close();
return cities;
}
public static City maxPopSearcher(List<?> cities) {
int max = 0;
for (City city : cities) {
if (city.getPopulation() > city.get(max)) max = cities.indexOf(city);
}
return cities.get(max);
}
public static City parseCSVLine1(String line) {
Scanner scanner = new Scanner(line);
scanner.useDelimiter(";");
scanner.skip("\\d*");
String name = scanner.next();
String region = scanner.next();
String district = scanner.next();
int population = scanner.nextInt();
String foundation = null;
if (scanner.hasNext()) {
foundation = scanner.next();
}
scanner.close();
return new City(name, region, district, population, foundation);
}
public static void unzip(String archivePath) throws IOException { // распаковывает архив
try { try (var file = new ZipFile(archivePath)) {
var entries = file.entries();
var uncompressedDirectory = new File(file.getName()).getParent() + File.separator;
while (entries.hasMoreElements()) {
var entry = entries.nextElement();
if (entry.isDirectory()) {
processDirectory(uncompressedDirectory, entry);
} else {
processFile(file, uncompressedDirectory, entry);
}
}
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
}
private static void processDirectory(String uncompressedDirectory, ZipEntry entry) { // создает папку из распакованного архива
var newDirectory = uncompressedDirectory + entry.getName();
System.out.println("Creating Directory: " + newDirectory);
var directory = new File(newDirectory);
if (!directory.exists()) {
directory.mkdirs();
}
}
private static void processFile(ZipFile file, String uncompressedDirectory, ZipEntry entry) throws IOException { // создает файл из распакованного архива
try (
var is = file.getInputStream(entry);
var bis = new BufferedInputStream(is)
) {
var uncompressedFileName = uncompressedDirectory + entry.getName();
try (
var os = new FileOutputStream(uncompressedFileName);
var bos = new BufferedOutputStream(os)
) {
while (bis.available() > 0) {
bos.write(bis.read());
}
}
}
System.out.println("Written: " + entry.getName());
}
private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
if (fileToZip.isHidden()) {
return;
}
if (fileToZip.isDirectory()) {
if (fileName.endsWith("/")) {
zipOut.putNextEntry(new ZipEntry(fileName));
} else {
zipOut.putNextEntry(new ZipEntry(fileName + "/"));
}
zipOut.closeEntry();
var children = fileToZip.listFiles();
for (File childFile : children) {
zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
}
return;
}
try (var fis = new FileInputStream(fileToZip)) {
var zipEntry = new ZipEntry(fileName);
zipOut.putNextEntry(zipEntry);
var bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
}
}
}
class City {
private String name;
private String region;
private String district;
private int population;
private String foundation;
public City(String n, String r, String d, int p, String f){
name = n;
region = r;
district = d;
population = p;
foundation = f;
}
public String getName() {
return name;
}
public String getDistrict() {
return district;
}
public int getPopulation() {
return population;
}
@Override
public String toString(){
return ("City{name='" + name + "', region='" + region + "', district='" + district + "', population='" + population + "', foundation='" + foundation + "'}");
}
}
class CityDistrictComparator implements Comparator<City> {
@Override // добавил аннотации
public int compare(City a, City b){
return a.getDistrict().compareTo(b.getDistrict());
}
}
class CityNameComparator implements Comparator<City> {
@Override
public int compare(City a, City b){
return a.getName().compareTo(b.getName());
}
}
Источник: Stack Overflow на русском