相当于Swift中的Java LinkedHashSet

时间:2016-08-22 07:06:27

标签: swift linkedhashset

在java中我们有:

private Set<AutoComplete> hashList = new LinkedHashSet<>();

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;
    }

然后,当您向 hashList 添加项目时,不允许重复的值,列表是排序。

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

我已经看过Does there exist within Swift's API an easy way to remove duplicate elements from an array?

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

var namesAndIds : [AutoComplete] = []

(删除重复项:)

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
    }

我有这个: 类型AutoComplete的值没有成员elemet

自动完成:

class AutoComplete{
    var id : String
    var name : String
    init(id: String,name: String) {
        self.name = name
        self.id = id
    }
}

2 个答案:

答案 0 :(得分:0)

对于想知道的人,我最终避免像下面的duplicate insertion issue一样。 但是这样的东西就像LinkedHashSet一样所以问题仍然存在!

我已经创建了

var namesAndIds = Set<AutoComplete>()
var finalAutoCompleteList = [AutoComplete]()

然后更正了AutoComplete类:

public class AutoComplete:NSObject{
    var id : String
    var name : String
    init(id: String,name: String) {
        self.name = name
        self.id = id
    }
    override public func isEqual(object: AnyObject?) -> Bool {
        if let object = object as? AutoComplete {
            return id == object.id
        } else {
            return false
        }
    }

    override public var hash: Int {
        return id.hashValue
    }

}

最后添加了Set to Array

finalAutoCompleteList = Array(namesAndIds)

答案 1 :(得分:-1)

在Swift中,您可以使用Set

与文档中一样:

  

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

类型必须是可散列的才能存储在集合中 - 也就是说,类型必须提供一种计算自身散列值的方法。

完全符合Swift标准库中的Hashable协议。

然后你就可以使用它:

var letters = Set<Character>()  //letters == []
letters.insert("a")             //letters == ["a"]
letters.insert("a")             //letters == ["a"] - no duplicates