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
类型必须是可哈希的才能存储在集合\xe2\x80\x94中,也就是说,该类型必须提供一种计算自身哈希值的方法。
\n\n只需遵守HashableSwift\xe2\x80\x99s 标准库的协议即可。
然后你可以像这样使用它:
\n\nvar letters = Set<Character>() //letters == []\nletters.insert("a") //letters == ["a"]\nletters.insert("a") //letters == ["a"] - no duplicates\nRun Code Online (Sandbox Code Playgroud)\n