У меня проблема с получением результата алгоритма бинарного поиска как получения пропущенных значений. Программа хочет, чтобы вы вводили название города, и показывает результаты ввода названий городов после прочтения каждой строки в файле и назначения каждой переменной City Object. Но есть проблема в части результата.
В списке 3 названия городов с названием "Москва", и после ввода названия города "Москва" отображаются 2 результата.
Как я могу исправить проблему. Я также поделился фрагментами своего кода, как показано ниже.
Вот мой объект City
public class City implements Serializable, Comparable<City>{
private Integer cityWeight;
private String cityName;
private String countryName;
...
@Override
public int compareTo(City o) {
// TODO Auto-generated method stub
City city = (City) o;
int compareage=city.getCityWeight();
if(compareage < 1) {
return getCityWeight()-compareage;
}else {
return compareage-getCityWeight();
}
}
}
Вот мой city.txt
93827
10381222 Moscow, Russia
23800 Moscow, Idaho, United States
2026 Moscow, Pennsylvania, United States
Вот мой процесс чтение части.
try(BufferedReader br = new BufferedReader(new FileReader(fileLocation))) {
line = br.readLine();
while (( line = br.readLine()) != null) {
String[] cityIdInformation = line.split(" ");
String cityId = cityIdInformation[0];
String[] cityNameCountryInformation = cityIdInformation[1].split(", ");
String cityName = cityNameCountryInformation[0];
String cityCountry = "";
if(cityNameCountryInformation.length == 2) {
cityCountry = cityNameCountryInformation[1];
}else {
cityCountry = cityNameCountryInformation[2];
}
cityId = cityId.trim();
cityName = cityName.trim();
cityCountry = cityCountry.trim();
City city = new City();
city.setCityWeight(Integer.parseInt(cityId));
city.setCityName(cityName);
city.setCountryName(cityCountry);
cities.add(city);
}
}
Вот моя основная часть.
private static void enterSearchValue() {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the word of character which I want to search : ");
String charWord = scanner.nextLine();
System.out.println("%cities.txt");
System.out.println("Search " + charWord);
if(charWord.length() > 3) {
ProcessMethod.binarySearchProcess(cities, charWord);
}
}
Функция показывает результаты расположения массива, добавляет его местоположение в Arraylist и показывает результат
public static void binarySearchProcess(ArrayList<City> cities, String charWord) {
System.out.println("binarySearchProcess is working ");
Integer[] indexArray = BinarySearch.binarySearch(cities, charWord);
for (int i = 0; i < indexArray.length; i++) {
System.out.print(indexArray[i] + " ");
}
System.out.println();
ShowResult.getValuesFromIndexArray(cities, indexArray);
}
public static void getValuesFromIndexArray(ArrayList<City> cities, Integer[] indexArray) {
ArrayList<City> resultCities = new ArrayList<>();
for (Integer index :indexArray) {
resultCities.add(cities.get(index));
}
showSearchCityValues(resultCities);
}
public static void showSearchCityValues(ArrayList<City> cities) {
System.out.println("----------------------------------------");
for(City city: cities) {
System.out.println("City Weight : " + city.getCityWeight() +
" | City Name : " + city.getCityName() +
" | City Country : " + city.getCountryName()
);
}
System.out.println("----------------------------------------");
System.out.println("The result of Search Size : " + cities.size());
}
Вот мой алгоритм двоичного поиска.
public static Integer[] binarySearch(List<City> cities, Comparable key) {
List<Integer> arrList = new ArrayList<Integer>();
int lo = 0, hi = cities.size() - 1, mid;
cities.sort((str1, str2) -> str1.getCityName().compareTo(str2.getCityName()));
while (lo <= hi) {
mid = lo + (hi - lo) / 2;
int cmp = key.compareTo(cities.get(mid).getCityName());
if (cmp == 0) {
arrList.add(mid);
lo = mid + 1;
} else if (cmp < 0)
hi = mid - 1;
else
lo = mid + 1;
}
return arrList.stream().toArray(Integer[]::new);
}
Вот результат.
Enter the word of character which I want to search : Moscow
%cities.txt
Search Moscow
binarySearchProcess is working
1 2
----------------------------------------
City Weight : 23800 | City Name : Moscow | City Country : United States
City Weight : 2026 | City Name : Moscow | City Country : United States
----------------------------------------
The result of Search Size : 2