相当于 Swift 中的 Java LinkedHashSet

Hov*_*ven 5 linkedhashset swift

在java中我们有:

private Set<AutoComplete> hashList = new LinkedHashSet<>();
Run Code Online (Sandbox Code Playgroud)

和:

public class AutoComplete {

    private String name;
    private String id;

    //...geters and setters

    @Override
    public boolean equals(Object o) {
        if (o instanceof AutoComplete) {
            AutoComplete autoComplete = (AutoComplete) o;
            if (name.equals(autoComplete.name) && id.equals(autoComplete.id))
                return true;
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = 17;
        int hashMultiplikator = 79;
        try {
            hash = hashMultiplikator * hash
                    + getId().hashCode();
        } catch (java.lang.Exception e) {
            e.printStackTrace();
            MLogger.logException("autocomplete id can't be null", e);
        }
        return hash;
    }
Run Code Online (Sandbox Code Playgroud)

然后,当您将项目添加到hashList时,将不允许重复值,并且列表会排序。

所以我的问题是如何在 Swift 中做到这一点?!

我已经看到Swift 的 API 中是否存在一种从数组中删除重复元素的简单方法?

当我将 AutoComplete 数组传递给 func uniq 时,

var namesAndIds : [AutoComplete] = []
Run Code Online (Sandbox Code Playgroud)

(用于删除重复项:)

namesAndIds.appendContentsOf(SingletonMappingContacts.sharedInstance.autoComplete)
namesAndIds = uniq(namesAndIds)

func uniq<S : SequenceType, T : Hashable where S.Generator.Element == T>(source: S) -> [T] {
        var buffer = [T]()
        var added = Set<T>()
        for elem in source {
            if !added.contains(elem) {
                buffer.append(elem)
                added.insert(elem)
            }
        }
        return buffer
    }
Run Code Online (Sandbox Code Playgroud)

我得到了这个: AutoComplete 类型的值没有成员元素

自动完成:

class AutoComplete{
    var id : String
    var name : String
    init(id: String,name: String) {
        self.name = name
        self.id = id
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ish -2

在 Swift 中你可以使用Set.

\n\n

如文档中所示:

\n\n
\n

集合在集合中存储相同类型的不同值,且没有定义顺序。当项目的顺序不重要或者需要确保项目仅出现一次时,可以使用集合而不是数组。

\n
\n\n

类型必须是可哈希的才能存储在集合\xe2\x80\x94中,也就是说,该类型必须提供一种计算自身哈希值的方法。

\n\n

只需遵守HashableSwift\xe2\x80\x99s 标准库的协议即可。

\n\n

然后你可以像这样使用它:

\n\n
var letters = Set<Character>()  //letters == []\nletters.insert("a")             //letters == ["a"]\nletters.insert("a")             //letters == ["a"] - no duplicates\n
Run Code Online (Sandbox Code Playgroud)\n

  • Set 并不完全等同于 LinkedHashSet(它*保留*元素的顺序)。 (4认同)