5

配列内で最も一般的な (モーダル) 要素を見つける必要があります。

私が考えることができる最も簡単な方法は、一意の要素ごとに変数を設定し、それぞれにカウント変数を割り当てることでした。これは、配列を実行する 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);

私のプログラムでは、配列内の上位 5 つの地名を見つける必要があります。

4

3 に答える 3

3

XCode 7.1 の場合、解決策は次のとおりです。

// Array of elements
let a = [7,3,2,1,4,6,8,9,5,3,0,7,2,7]

// Create a key for elements and their frequency
var times: [Int: Int] = [:]

// Iterate over the dictionary
for b in a {
    // Every time there is a repeat value add one to that key
    times[b] = (times[b] ?? 0) + 1
}

// This is for sorting the values
let descending = times.sort({$0.1 > $1.1})
// For sorting the keys the code would be 
// let descending = times.sort({$0.0 > $1.0})
// Do whatever you want with sorted array
print(descending)
于 2015-10-25T07:00:13.330 に答える
0

reduceの代わりにa を使用して、対気速度速度と同じfor-in:

extension Sequence where Self.Iterator.Element: Hashable {
    func frequencies() -> [(Self.Iterator.Element, Int)] {
        return reduce([:]) {
            var frequencies = $0
            frequencies[$1] = (frequencies[$1] ?? 0) + 1
            return frequencies
        }.sorted { $0.1 > $1.1 }
    }
}

ただし、ここで aを使用reducestructfor-inすると、構造体のコピー コストがかかるため、a ほど効率的ではないことに注意してください。したがって、一般的には、それを行う方法を好むでしょうfor-in

[編集: おやおや、記事は一番上の回答と同じ人によるものです!]

于 2016-12-06T10:33:20.487 に答える