Java hashmaps без значения?

Возможность с str_extract_all() из stringr:

sapply(str_extract_all(x, "-?[0-9]+?[0-9]*"), function(x) x[1])

[1] "001" "-08" "-01"

sapply(str_extract_all(x, "-?[0-9]+?[0-9]*"), function(x) x[2])

[1] "979" "976" "975"

Или используя идею @Ruman Luštrik с strsplit():

sapply(strsplit(gsub("Demand = ", "", x), " "), function(x) x[1])

[1] "001" "-08" "-01"
25
задан IAdapter 13 May 2009 в 12:11
поделиться

6 ответов

Вы хотите использовать Collection, реализующий интерфейс Set, возможно, HashSet, чтобы получить заявленную производительность. См. http://java.sun.com/javase/6/docs/api/java/util/Set.html

6
ответ дан 28 November 2019 в 18:15
поделиться

Кроме Set s, в некоторых случаях может потребоваться преобразовать карту в Set с помощью Collections.newSetFromMap (Map ) (некоторые Map запрещают нулевые значения, следовательно, Boolean ).

1
ответ дан 28 November 2019 в 18:15
поделиться

, как все говорили, HashSet, вероятно, самое простое решение, но у вас не будет постоянного поиска времени в HashSet (поскольку записи могут быть связаны), и вы сохраните фиктивный объект (всегда один и тот же) для каждой записи ...

Для информации здесь список структур данных , возможно, вы найдете ту, которая лучше соответствует вашим потребностям.

-1
ответ дан 28 November 2019 в 18:15
поделиться

Используйте вместо него HashSet . Это хеш-реализация Set , которая используется в основном для того, что вы описываете (неупорядоченный набор элементов).

46
ответ дан 28 November 2019 в 18:15
поделиться

Обычно вы должны использовать реализацию Set и чаще всего HashSet. Если вам действительно нужен параллельный доступ, то ConcurrentHashSet предоставляет заменяющую функцию, которая обеспечивает безопасный параллельный доступ, включая безопасную итерацию по набору.

I ' Я рекомендую в любом случае ссылаться на него как на просто Set во всем вашем коде, за исключением того места, где вы его создаете; таким образом, легче отказаться от одной реализации для другой, если она вам понадобится позже.

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

  • убедившись, что единственные ссылки на набор находятся в конечных полях ;
  • убедиться, что ни один поток действительно не изменяет набор.

Вы можете помочь гарантировать последнее, используя оболочку Collections.unmodifiableSet (). Это дает вам неизменяемое представление о данном наборе - так что при отсутствии других «обычных» ссылок на экранирование набора вы в безопасности.

7
ответ дан 28 November 2019 в 18:15
поделиться

Вероятно, вы захотите использовать java.util.Set . Реализации включают java.util.HashSet , который является эквивалентом HashMap в Set

. Даже если объекты, содержащиеся в коллекции, не изменяются, вам может потребоваться синхронизация. Нужно ли добавлять новые объекты в набор после того, как набор передается в другой поток? Если это так, вы можете использовать Collections.synchronizedSet () , чтобы сделать Set потокобезопасным.

Если у вас есть карта со значениями, и у вас есть код, который просто хочет рассматривать карту как Set, вы можете использовать Map.entrySet () (хотя имейте в виду, что entrySet возвращает представление Set ключей на карте; если карта изменяема, карту можно изменить с помощью набора, возвращенного entrySet).

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

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