Конвертировать словарь Python в Java hashmap, где типы значений представляют собой смесь структур данных и лямбда-функций - PullRequest
1 голос
/ 28 апреля 2019

Я пытаюсь преобразовать код python, предоставленный нашим инструктором, в эквивалентный код Java.Эта часть кода должна считывать из txt-файла, анализировать данные с помощью регулярных выражений и сохранять их как массив слов.Ограничением для этого упражнения является то, что «data_storage_obj» используется для имитации объекта JavaScript, и мы должны держать их в этом формате ключ-значение.

Инструкция указывает, что структура данных в Java, которая является ближайшей кОбъект JavaScript - это «HashMap».Однако, поскольку каждый ключ сопоставляется с отдельной структурой данных для хранения соответствующей информации, лучшим типом, который я могу себе представить, является «Объект».Однако один из ключей сопоставляется с лямбда-функцией, поэтому я получаю это сообщение об ошибке, в котором говорится: «ошибка: несовместимые типы: объект не является функциональным интерфейсом».Мне интересно, какой тип я должен использовать, чтобы охватить все типы, которые я собираюсь сохранить в качестве значений карты.

Фрагмент кода, предоставленного инструктором:

def extract_words(obj, path_to_file):
    with open(path_to_file) as f:
        obj['data'] = f.read()
    pattern = re.compile('[\W_]+')
    data_str = ''.join(pattern.sub(' ', obj['data']).lower())
    obj['data'] = data_str.split()

data_storage_obj = {
    'data' : [],
    'init' : lambda path_to_file : extract_words(data_storage_obj, path_to_file),
    'words' : lambda : data_storage_obj['data']
}

data_storage_obj['init'](sys.argv[1])

Javaкод, над которым я работал:

public class Twelve{
    static void extract_words(Object obj, String path_to_file){
        System.out.println("extract_words()");
        if(obj instanceof HashMap){
            HashMap<String, Object> hashMap = (HashMap<String, Object>) obj;
            String file_data = "";
            try {
                file_data = (new String(Files.readAllBytes(Paths.get(path_to_file)))).replaceAll("[\\W_]+", " ").toLowerCase();
            } catch (IOException e) {
                e.printStackTrace();
            }
            hashMap.put("data", Arrays.asList(file_data.split(" ")));
            obj = hashMap;
        }
    }

    static HashMap<String, Object> data_storage_obj = new HashMap<>();

    public static void main(String[] args){
        ArrayList<String> data = new ArrayList<String>();
        data_storage_obj.put("data", data);
        data_storage_obj.put("init", path_to_file -> extract_words(data_storage_obj, path_to_file));
        data_storage_obj.put("words", data_storage_obj.get("data"));
    }
}

1 Ответ

0 голосов
/ 28 апреля 2019

Чтобы представить объект со «статическими» свойствами, вы можете использовать Singleton :

  class DataStorage {
    ArrayList<String> data = new ArrayList<String>();

    void init(String pathToFile) { // ¹
     // ²
     try {
      this.data = (new String(Files.readAllBytes(Paths.get(pathToFile)))).replaceAll("[\\W_]+", " ").toLowerCase();
     } catch (IOException e) {
      e.printStackTrace();
     }            
    }

    ArrayList<String> getWords() { // ³
     return this.data;
    }
 }

При переносе с языка сценариев (Python, JavaScript) на язык статической типизации(Java), вы не можете просто сохранить динамическую структуру.Вместо этого вы должны добавить адекватные типы, а поскольку в Java есть только классы, вам нужен еще один класс.

При переносе вы должны адаптировать общие практики из языка, на который вы переносите:

Use: используйте camelCase для методов / переменных.

²: поскольку в Java нет автономных функций, extract_words можно напрямую объединить с методом init (или добавить его как метод staticна DataStorage).

³: Поскольку в Java нет реальных методов получения / установки, вам придется вернуться к шаблону «метод как получатель».

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