В Clojure, когда я должен использовать вектор над списком, и наоборот?

git clone initial final
cd final
git filter-branch --tree-filter 'rm -rf <list of folders separated by space>' HEAD

Выше команды удалят любые папки, упомянутые в списке, но ваша исходная история фиксации будет сохранена.

git filter-branch -f --prune-empty 

Затем можно использовать для удаления любых пустых коммитов, которые могут отображаться на вашем Список удаленных папок.

Альтернативно, если у вас есть большой репозиторий, который имеет значительно долгую историю, это может занять некоторое время. В этом случае вы можете использовать несколько иной подход -

Начните с создания отдельных репозиториев для каждой папки, которую вы хотите перенести. Это можно сделать с помощью команды filter-branch следующим образом

 git filter-branch –prune-empty –subdirectory-filter A/ master
 git filter-branch –prune-empty –subdirectory-filter B/ master

Каждый из них будет иметь содержимое соответствующих папок вместе со всей их историей. Затем вы можете использовать их как временные репозитории на удаленном компьютере. (они также будут действовать как контрольные точки в случае необходимости повторного выполнения процесса)

Затем создайте новый репозиторий

git clone <remote path> NewRepo
cd NewRepo

# add a readme file
touch Readme.md
git add .
git commit -am "Adding ReadMe file"

Затем вы можете объединить отдельные папки (A и B repos) в NewRepo

# Merge Repo A
git remote add -f A <remote path for A>
git merge -s ours --no-commit A/master
git read-tree --prefix=A/ -u A/master
git commit -m "Merge A into NewRepo"
git remote remove A

# Merge Repo B
git remote add -f B <remote path for B>
git merge -s ours --no-commit B/master
git read-tree --prefix=B/ -u B/master
git commit -m "Merge B into NewRepo"
git remote remove B

Затем вы можете подтвердить, что ваш источник настроен на то, чтобы указать на NewRepo и нажать код

git remote add origin <remote path for NewRepo>
git push origin master

NewRepo теперь должен содержать обе папки и вся их история.

140
задан ROMANIA_engineer 30 October 2017 в 18:00
поделиться

4 ответа

И снова кажется, что я ответил на свой вопрос, проявив нетерпение и задав его в #clojure на Freenode. На Stackoverflow.com рекомендуется отвечать на свои вопросы: D

Я быстро поговорил с Ричем Хики, и вот его суть.

[12:21] <Raynes>    Vectors aren't seqs, right?
[12:21] <rhickey>   Raynes: no, but they are sequential
[12:21] <rhickey>   ,(sequential? [1 2 3])
[12:21] <clojurebot>    true
[12:22] <Raynes>    When would you want to use a list over a vector?
[12:22] <rhickey>   when generating code, when generating back-to-front
[12:23] <rhickey>   not too often in Clojure
109
ответ дан 23 November 2019 в 23:15
поделиться

If you've done Java programming a lot, and are familiar with the Java collection framework, think of lists like LinkedList, and vectors like ArrayList. So you can pretty much choose containers the same way.

For further clarification: if you intend to add items individually to the front or the back of the sequence a lot, a linked list is much better than a vector, because the items don't need to be shuffled around each time. However, if you want to get at specific elements (not near the front or back of the list) frequently (i.e., random access), you will want to use vector.

By the way, vectors can easily be turned into seqs.

user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)
84
ответ дан 23 November 2019 в 23:15
поделиться

просто небольшое примечание:

"I read that Vectors are not seqs, but Lists are." 

последовательности более универсальны, чем списки или векторы (или карты или наборы).
К сожалению, REPL печатает списки и последовательности одинаково , потому что это действительно делает вид, будто списки являются последовательностями, даже если они разные. функция (seq) будет создавать последовательность из множества разных вещей, включая списки, и затем вы можете передать эту последовательность любой из множества функций, которые делают изящные вещи с помощью seqs.

user> (class (list 1 2 3))
clojure.lang.PersistentList

user> (class (seq (list 1 2 3)))
clojure.lang.PersistentList

user> (class (seq [1 2 3]))
clojure.lang.PersistentVector$ChunkedSeq

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

user> (let [alist (list 1 2 3)] (identical? alist (seq alist)))
true
user> (identical? (list 1 2 3) (seq (list 1 2 3)))
false

static public ISeq seq(Object coll){
        if(coll instanceof ASeq)
                return (ASeq) coll;
        else if(coll instanceof LazySeq)
                return ((LazySeq) coll).seq();
        else
                return seqFrom(coll);
}

списки являются последовательностями, хотя и другие вещи тоже, и не все последовательности являются списками.

13
ответ дан 23 November 2019 в 23:15
поделиться

Векторы имеют время произвольного доступа O (1), но они должны быть заранее выделены. Списки можно расширять динамически, но доступ к случайному элементу составляет O (n).

39
ответ дан 23 November 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: