gpt4 book ai didi

arrays - 最常见的数组元素

转载 作者:行者123 更新时间:2023-11-30 12:50:55 25 4
gpt4 key购买 nike

我需要找到数组中最常见的(模态)元素。

我能想到的最简单的方法是为每个唯一元素设置变量,并为每个元素分配一个计数变量,每次在遍历数组的 for 循环中记录该变量时,该变量都会增加。

不幸的是数组的大小是未知的并且会非常大,所以这个方法没有用。

我在 Objective-C 中遇到过类似的问题,它使用 NSCountedSet 方法对数组元素进行排名。不幸的是,我对编程非常陌生,只能将第一行翻译成 Swift。

建议的方法如下:

    var yourArray: NSArray! // My swift translation

NSCountedSet *set = [[NSCountedSet alloc] initWithArray:yourArray];

NSMutableDictionary *dict=[NSMutableDictionary new];

for (id obj in set) {
[dict setObject:[NSNumber numberWithInteger:[set countForObject:obj]]
forKey:obj]; //key is date
}

NSLog(@"Dict : %@", dict);

NSMutableArray *top3=[[NSMutableArray alloc]initWithCapacity:3];

//which dict obj is = max
if (dict.count>=3) {

while (top3.count<3) {
NSInteger max = [[[dict allValues] valueForKeyPath:@"@max.intValue"] intValue];

for (id obj in set) {
if (max == [dict[obj] integerValue]) {
NSLog(@"--> %@",obj);
[top3 addObject:obj];
[dict removeObjectForKey:obj];
}
}
}
}

NSLog(@"top 3 = %@", top3);

在我的程序中,我需要在数组中查找前五个地名。

最佳答案

编辑:现在使用下面的 Swift 2.0

不是最有效的解决方案,而是一个简单的解决方案:

let a = [1,1,2,3,1,7,4,6,7,2]

var frequency: [Int:Int] = [:]

for x in a {
// set frequency to the current count of this element + 1
frequency[x] = (frequency[x] ?? 0) + 1
}

let descending = sorted(frequency) { $0.1 > $1.1 }

降序 现在由一组对组成:值和频率,将出现频率最高的排在最前面。因此,“前 5 名”将是前 5 个条目(假设有 5 个或更多不同的值)。源数组有多大并不重要。

这是一个适用于任何序列的通用函数版本:

func frequencies
<S: SequenceType where S.Generator.Element: Hashable>
(source: S) -> [(S.Generator.Element,Int)] {

var frequency: [S.Generator.Element:Int] = [:]

for x in source {
frequency[x] = (frequency[x] ?? 0) + 1
}

return sorted(frequency) { $0.1 > $1.1 }
}

frequencies(a)
<小时/>

对于 Swift 2.0,您可以将该函数改编为协议(protocol)扩展:

extension SequenceType where Generator.Element: Hashable {
func frequencies() -> [(Generator.Element,Int)] {

var frequency: [Generator.Element:Int] = [:]

for x in self {
frequency[x] = (frequency[x] ?? 0) + 1
}

return frequency.sort { $0.1 > $1.1 }
}
}

a.frequencies()

对于 Swift 3.0:

extension Sequence where Self.Iterator.Element: Hashable {
func frequencies() -> [(Self.Iterator.Element,Int)] {

var frequency: [Self.Iterator.Element:Int] = [:]

for x in self {
frequency[x] = (frequency[x] ?? 0) + 1
}

return frequency.sorted { $0.1 > $1.1 }
}
}

关于arrays - 最常见的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com