пытаясь прочитать текстовый файл в clojure и вставить данные в список или вектор - PullRequest
1 голос
/ 20 апреля 2019

Таким образом, в основном мой вопрос заключается в том, что я пытался прочитать данные из текстового файла, состоящего из следующих чисел: «1 5 3 8 9 3 23 67 90», и я хотел прочитать их число за номером и поместить их всписок или вектор или массив.Однако это мой первый раз, когда я пишу код с Clojure, и поэтому я задаю этот вопрос.

Что я сделал до сих пор, так это то, что я уверен, что это неправильно.

(def nums11 (slurp "C:\\Users\\XXX\\Desktop\\100.txt"))

Однако это будет читать файл только как одну строку.поэтому я решил добавить эту строку

(clojure.string/split nums11 #" ")

, есть ли способ добавить их после того, как я разделю их, в список, вектор или массив.

или, может быть, есть простойспособ сделать это?

Заранее спасибо.

1 Ответ

3 голосов
/ 20 апреля 2019

Вы уже на правильном пути, поэтому я попытаюсь объяснить, что будет дальше:

Функция clojure.string/split возвращает vector строк.Вектор в Clojure представляет собой коллекцию , которая реализует интерфейс Java java.util.List, поэтому все готово, если все, что вам нужно, - это преобразовать содержимое файла в коллекцию строк, представляющих числа (чтобы превратить их вфактические числа, читайте дальше).

Возможно, вы хотите манипулировать элементами как фактические числа.В Clojure вам нужно использовать некоторую функцию, чтобы превратить каждую строку в число (скажем, "34" в фактическое число 34).Есть два простых способа: использовать взаимодействие с Java и вызвать Integer.parseInt(...) или использовать функцию, предоставленную Clojure, которая может читать строку и возвращать все, что она представляет (например, read-string).

Поскольку мынеобходимо вызвать функцию (read-string) для каждого элемента списка строк, представляющих числа, мы будем использовать map, функцию, которая принимает функцию f и коллекцию xs, и вызывает функциюf для каждого элемента xs, возвращая результат в виде другого списка.

Если мы склеим все это вместе, это будет примерно так (я буду использовать let для присвоения именпромежуточные результаты):

(let [file-contents   (slurp "C:\\Users\\XXX\\Desktop\\100.txt")                                                                                                                                 
      nums-as-strings (clojure.string/split file-contents #" ")                                                                                                             
      numbers         (map read-string nums-as-strings)]

... здесь список чисел будет на numbers;и теперь вы можете выполнять над ними операции, например, суммировать их все:

(reduce + numbers) ;; Compute the sum of all the numbers

Существует ряд мелких деталей, которые я замаскировал, но это должно поставить вас на правильный путь.

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