Получение Un общего элемента от малого массива к большому и наоборот [duplicate]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

82
задан devios1 5 July 2014 в 19:06
поделиться

4 ответа

Да, Swift имеет класс Set.

let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]

let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)

Swift 3.0+ может выполнять операции над наборами как:

firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr

Swift 2.0 может вычислять по аргументам массива :

set1.union(array2)       // {"a", "b", "c", "d"} 
set1.intersect(array2)   // {"a", "b"}
set1.subtract(array2)    // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}

Swift 1.2+ может рассчитывать на множествах:

set1.union(set2)        // {"a", "b", "c", "d"}
set1.intersect(set2)    // {"a", "b"}
set1.subtract(set2)     // {"c"}
set1.exclusiveOr(set2)  // {"c", "d"}

Если вы используете настраиваемые структуры, вам необходимо реализовать Hashable.

Спасибо Майклу Стерну в комментариях к обновлению Swift 2.0.

Спасибо Amjad Husseini в комментариях к информации Hashable.

151
ответ дан joelparkerhenderson 18 August 2018 в 17:21
поделиться
  • 1
    Обратите внимание, что по крайней мере с Swift 2.0 вы можете передать массив в качестве аргумента для этих функций. Таким образом, set1.union(array2) и set1.exclusiveOr(array2) являются законными, в дополнение к формам, показанным выше. – Michael Stern 2 October 2015 в 16:17
  • 2
    Что делать, если вы хотите пересечь 5 массивов? Или 6? Что, если количество массивов неизвестно? – Nathan McKaskle 10 December 2015 в 20:46
  • 3
    @Nathan Зависит от заданной операции. Например, set union и set intersection являются коммутативными и ассоциативными, поэтому вы можете обрабатывать множество множеств, используя итерацию или цепочку. Или вы можете создавать собственные методы, которые используют var args, такие как Set union_all (...) и intersect_all (...). – joelparkerhenderson 12 December 2015 в 04:57
  • 4
    Если вы используете настраиваемые структуры, вы должны соответствовать Hashable, что может раздражать, если у вас сложная структура – Amjad Husseini 6 November 2017 в 12:43
  • 5
    @Amjad Хорошая мысль, я добавлю свою заметку к моему ответу. – joelparkerhenderson 18 November 2017 в 06:01

Самый эффективный метод, который я знаю, - это использование чисел godel. Google для кодирования godel.

Идея такова. Предположим, у вас есть N возможных номеров, и вам нужно сделать их. Например, N = 100 000 и хотите сделать такие наборы, как {1,2,3}, {5, 88, 19000} и т. Д.

Идея состоит в том, чтобы сохранить список N простых чисел в памяти и для данного набора {a, b, c, ...} вы кодируете его как

 prime[a]*prime[b]*prime[c]*...

. Таким образом, вы кодируете набор как BigNumber. Операции с BigNumbers, несмотря на то, что они медленнее операций с целыми, все еще очень быстрые.

Чтобы объединить 2 набора A, B, вы берете

  UNITE(A, B) = lcm(a, b)

общий-кратный A и B, поскольку A и B являются наборами и обоими числами.

Чтобы сделать пересечение, которое вы берете

 INTERSECT(A, B) = gcd (a, b)

наибольший общий делитель.

и т. д.

Эта кодировка называется godelization, вы можете google для большего, все языки арифметики, написанные с использованием логики Frege, могут быть закодированы с использованием чисел таким образом.

Чтобы получить операцию-член? это очень просто -

ISMEMBER(x, S) = remainder(s,x)==0

Чтобы получить кардинал, это немного сложнее -

CARDINAL(S) = # of prime factors in s

вы разлагаете число S, представляющее множество в произведении простых факторов и добавить их экспоненты. Если набор не позволяет дублировать, у вас будут все показатели 1.

1
ответ дан alinsoar 18 August 2018 в 17:21
поделиться

Возможно, вам захочется следовать той же схеме, что и в Objective-C, которая также не имеет таких операций, но существует простой способ:

как пересечь два массива в объекте C?

0
ответ дан Community 18 August 2018 в 17:21
поделиться

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

0
ответ дан connor 18 August 2018 в 17:21
поделиться
  • 1
    Предупреждающее примечание: я использовал ExSwift без проблем для Swift 1.x, но для Swift 2.x он кажется довольно сломанным, и на момент написания этой статьи не было обновлено через несколько месяцев. Есть тонна вилок, которые могут получить больше внимания. – Robin Macharg 28 September 2015 в 10:21
Другие вопросы по тегам:

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