оптимизация времени поиска в hashmap - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть CSV-файл, который имеет хеш-карту, и всякий раз, когда пользователь вводит название города (ключ), он отображает все детали этого города.Я должен оптимизировать время поиска результатов, каждый раз, когда он читает файл (а не только один раз) и отображает значения.CSV-файлы содержат такие данные:

город, city_ascii, lat, lng, страна, iso2, iso3, admin_name, столица, население, id Malishevë, Malisheve, 42.4822,20.7458, Косово, XK,XKS, Malishevë, admin ,, 1901597212 Призрен, Призрен, 42.2139,20.7397, Косово, XK, XKS, Prizren, admin ,, 1901360309 Зубин Поток, Зубин Поток, 42.9144,20.6897, Косово, XK, XKS, Зубин Поток, администратор ,,1901608808

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.io.IOException;
public class CSVFileReaders{
public static void main(String[] args) {
    String filePath = "C:\\worldcities1.csv";
    Scanner in = new Scanner(System.in);                                      
    System.out.println(" \n Enter the City name to be Searched :   \n _> ");
    long start = System.currentTimeMillis();
    String searchTerm = in.nextLine();
    readAndFindRecordFromCSV(filePath, searchTerm);
    long end = System.currentTimeMillis(); 
    System.out.println(" \n It took " + (end - start) + " Milli Seconds to search the result \n");
    in.close();
}

public static void readAndFindRecordFromCSV( String filePath, String searchTerm) {
    try{            
        HashMap<String,ArrayList<String>> cityMap = new HashMap<String,ArrayList<String>>();        
        Scanner x = new Scanner (new File(filePath),"UTF-8");
        String city= "";
        while(x.hasNextLine()) {
        ArrayList<String> values = new ArrayList<String>();
        String name  = x.nextLine();
        //break each line of the csv file to its elements
        String[] line = name.split(",");
        city = line[1];
            for(int i=0;i<line.length;i++){
                values.add(line[i]);            
            }
        cityMap.put(city,values);       
        }
        x.close();
        //Search the city
        if(cityMap.containsKey(searchTerm)) {

                System.out.println("City name is : "+searchTerm+"\nCity details are accordingly in the order :"
                                    + "\n[city , city_ascii , lat , lng , country , iso2 , iso3 , admin_name , capital , population , id] \n"
                                    +cityMap.get(searchTerm)+"");

            }           
        else {
            System.out.println("Enter the correct City name");
        }                       
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

} `

время должно быть оптимизировано, и каждый раз, когда я ищу, он читает весь файл (что должно произойти)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Почему вы создаете / загружаете файл CSV в HashMap при каждом поиске?Просто создайте HashMap только один раз в начале , а затем при каждом поиске просто проверьте, существует ли он в HashMap, например, переместите читаемую часть в отдельный метод:

HashMap<String,ArrayList<String>> cityMap = new HashMap<String,ArrayList<String>>(); 

public static void readCSVIntoHashMap( String filePath) {
    try{            

        Scanner x = new Scanner (new File(filePath),"UTF-8");
        String city= "";
        while(x.hasNextLine()) {
        ArrayList<String> values = new ArrayList<String>();
        String name  = x.nextLine();
        //break each line of the csv file to its elements
        String[] line = name.split(",");
        city = line[1];
            for(int i=0;i<line.length;i++){
                values.add(line[i]);            
            }
        cityMap.put(city,values);       
        }
        x.close();
    ...
    }

Затеместь отдельный метод поиска:

public static void search(String searchTerm) {
  if(cityMap.containsKey(searchTerm)) {
  ...
}
}
0 голосов
/ 05 февраля 2019

В настоящее время вы смешиваете инициализацию карты в функции поиска.
Вы не хотите этого.
Сначала инициируйте карту, затем используйте ее в функции поиска.
Для этого извлекитеметод для операторов, которые создают и оценивают карту, а затем реорганизуют метод readAndFindRecordFromCSV(), чтобы он принимал Map в качестве дополнительного параметра:

 public static void readAndFindRecordFromCSV( String filePath, String searchTerm,  HashMap<String,ArrayList<String>> dataByCity) {...}

С рефакторингом функций IDE это должно быть достаточно просто: "Извлечение метода "then" изменить подпись ".

Вот код (не проверенный во время выполнения, но проверенный во время компиляции), который разбивает логическое на отдельные задачи и также полагается на методы экземпляра:

public class CSVFileReaders {

    private final String csvFile;
    private HashMap<String, ArrayList<String>> cityMap;
    private final Scanner in = new Scanner(System.in);

    public static void main(String[] args) {
        String filePath = "C:\\worldcities1.csv";
        CSVFileReaders csvFileReaders = new CSVFileReaders(filePath);
        csvFileReaders.createCitiesMap();
        csvFileReaders.processUserFindRequest(); // First search
        csvFileReaders.processUserFindRequest(); // Second search
    }


    public CSVFileReaders(String csvFile) {
        this.csvFile = csvFile;
    }

    public void createCitiesMap() {
        cityMap = new HashMap<>();
        try (Scanner x = new Scanner(new File(csvFile), "UTF-8")) {
            String city = "";
            while (x.hasNextLine()) {
                ArrayList<String> values = new ArrayList<String>();
                String name = x.nextLine();
                //break each line of the csv file to its elements
                String[] line = name.split(",");
                city = line[1];
                for (int i = 0; i < line.length; i++) {
                    values.add(line[i]);
                }
                cityMap.put(city, values);
            }
            x.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }


    public void processUserFindRequest() {

        System.out.println(" \n Enter the City name to be Searched :   \n _> ");
        long start = System.currentTimeMillis();
        String searchTerm = in.nextLine();
        long end = System.currentTimeMillis();
        System.out.println(" \n It took " + (end - start) + " Milli Seconds to search the result \n");
        //Search the city
        if (cityMap.containsKey(searchTerm)) {
            System.out.println("City name is : " + searchTerm + "\nCity details are accordingly in the order :"
                                       + "\n[city , city_ascii , lat , lng , country , iso2 , iso3 , admin_name , capital , population , id] \n"
                                       + cityMap.get(searchTerm) + "");
        } else {
            System.out.println("Enter the correct City name");
        }
    }
}

Интересная часть здесь:

String filePath = "C:\\worldcities1.csv";
CSVFileReaders csvFileReaders = new CSVFileReaders(filePath);
csvFileReaders.createCitiesMap();
csvFileReaders.processUserFindRequest(); // First search
csvFileReaders.processUserFindRequest(); // Second search

Логика теперь яснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...