問題タブ [collections]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - アイテムの順序に関係なく、2 つのコレクションが等しいかどうかを比較する
2 つのコレクションを (C# で) 比較したいのですが、これを効率的に実装する最善の方法がわかりません。
Enumerable.SequenceEqualに関する他のスレッドを読みましたが、それはまさに私が探しているものではありません。
私の場合、両方に同じアイテムが含まれている場合、2 つのコレクションは等しくなります (順序に関係なく)。
例:
私が通常行うことは、あるコレクションの各アイテムをループして、それが他のコレクションに存在するかどうかを確認し、次に他のコレクションの各アイテムをループして最初のコレクションに存在するかどうかを確認することです。(長さを比較することから始めます)。
ただし、これは完全に正しいわけではなく、おそらく 2 つのコレクションが等しいかどうかを比較する最も効率的な方法ではありません。
間違っていると私が考えることができる例は次のとおりです。
これは私の実装と同じです。各アイテムが見つかった回数をカウントし、両方のコレクションでカウントが等しいことを確認する必要がありますか?
例はある種の C# (疑似 C# と呼びましょう) で書かれていますが、どの言語で答えてもかまいません。
注:簡単にするために例では整数を使用しましたが、参照型オブジェクトも使用できるようにしたいと考えています (内容ではなくオブジェクトの参照のみが比較されるため、これらはキーとして正しく動作しません)。
c# - IEnumeratorインターフェイスをどのように実装しますか?
オブジェクトをオブジェクトにマップするクラスがありますが、辞書とは異なり、両方の方法でマップします。IEnumerator
現在、値を反復処理するカスタムインターフェイスを実装しようとしています。
c# - 重複したオブジェクトをコレクションに挿入しようとしたときにスローする正しい .NET 例外は何ですか?
コレクションであるプロパティ AssignedSoftware を持つ Asset オブジェクトがあります。
同じソフトウェアがアセットに複数回割り当てられていないことを確認したいと考えています。Add メソッドで、ソフトウェアが既に存在するかどうかを確認し、存在する場合は例外をスローします。
スローする必要がある標準の .NET 例外はありますか? または、ベスト プラクティスでは、独自のカスタム例外を作成する必要がありますか?
c# - コレクションを読み取り専用として返す
情報のコレクションを維持するマルチスレッド環境にオブジェクトがあります。
現在、共有違反からコレクションを保護するために でreturn data;
ラップしています。ReaderWriterLockSlim
ただし、念のために言うと、呼び出し元のコードがコレクションに変更を加えることができず、既に存在するもののみを表示できるように、コレクションを読み取り専用として返したいと思います。これはまったく可能ですか?
c# - 2 つのコレクションのマージ
を返す関数を取得し、Collection<string>
それ自体を再帰的に呼び出して、最終的に大きな 1 つを返しますCollection<string>
。
さて、リストをマージするための最良のアプローチは何だろうか? Collection.CopyTo()
string[] にコピーするだけで、foreach()
ループを使用すると効率が悪いように感じます。ただし、重複も除外したいので、. を呼び出す foreach になってしまう気がしContains()
ますCollection
。
重複のない文字列のリストを返す再帰関数を使用するより効率的な方法はありますか? を使用する必要はありませんCollection
。ほぼすべての適切なデータ型にすることができます。
除外のみ、私は Visual Studio 2005 と .net 3.0 にバインドされているため、LINQ はありません。
編集:明確にするために:関数はユーザーをActive Directoryから取り出し、ユーザーの直属の部下を調べてから、すべてのユーザーの直属の部下を再帰的に調べます。したがって、最終結果は、特定のユーザーの「コマンドチェーン」にあるすべてのユーザーのリストです。これは頻繁に実行され、現時点では一部のユーザーで20秒かかるため、改善する方法を探しています. 24時間の結果をキャッシュすることも私のリストにありますが、キャッシュを適用する前にそれを改善する方法を知りたいです。
.net - .NET の非ジェネリック コレクションは時代遅れですか?
別の言い方をすると:
タイプセーフなコレクションよりも緩く型付けされたコレクションを選択する正当な理由はありますか (HashTable と Dictionary)? それらは互換性のためだけにまだ存在しますか?
私が理解している限りでは、ジェネリック コレクションはタイプ セーフであるだけでなく、パフォーマンスも優れています。
このトピックに関する包括的な記事は次のとおりです: C# 2.0 を使用したデータ構造の広範な調査。
c# - 一度に複数のオブジェクトを追加して通知を受け取るための .Net コレクションは?
System.Collections.ObjectModel ObservableCollection<T>
クラスを検討していました。これは奇妙だから
- 1 つの項目のみを受け取る Add メソッドがあります。AddRange または同等のものはありません。
- Notification イベントの引数には NewItems プロパティがあり、これは(オブジェクトの.. T ではなく) IListです。
ここで必要なのは、オブジェクトのバッチをコレクションに追加することであり、リスナーも通知の一部としてバッチを取得します。ObservableCollection で何か不足していますか? 私の仕様を満たす別のクラスはありますか?
更新: 可能な限り自分でロールバックしたくありません。追加/削除/変更などを組み込む必要があります。たくさんのものがあります。
java - Java での小さな (1 ~ 10 項目) インスタンス レベルのコレクションの使用
Java でクラスを作成しているときに、事前にわかっているインスタンス レベルのコレクションを作成していることに気付くことがよくあります (コレクション内のアイテムは 10 未満)。しかし、事前にアイテムの数がわからないので、通常は動的コレクション (ArrayList、Vector など) を選択します。
私の一部は、これほど小さなサイズのものに複雑な動的コレクションを使用するのは無駄だとしつこく言い続けています。このようなものを実装するより良い方法はありますか? それともこれが標準ですか?
注意してください、私は(顕著な)パフォーマンスのペナルティやそのようなものに見舞われていません。これは、物事を行うためのより良い方法がないかどうか疑問に思っているだけです。
java - 署名が競合するいくつかのインターフェイスを実装します
最後に、次のようなハイブリッド構造を Java で実装しようとしました。
HasKey は次のインターフェイスです。
残念ながら、Java の Set インターフェイスと Map インターフェイスのメソッド シグネチャの間にはいくつかの競合があります。最終的に、Set インターフェイスのみを実装し、このインターフェイスを実装せずに Map メソッドを追加することにしました。
もっと良い解決策はありますか?
最初のコメントに応えて、ここに私の目標があります:
セット構造を持ち、特定のキー値に対応するこのセットの値のサブセットに効率的にアクセスできます。最初はマップとセットをインスタンス化しましたが、パフォーマンスを最適化するために 2 つの構造を結合しようとしました。
java - 同時変更を検出していますか?
私が取り組んでいるマルチスレッド アプリケーションでは、ときどきConcurrentModificationExceptions
リスト (主に 、場合によってはArrayList
ベクトル) が表示されます。しかし、コレクションを繰り返し処理すると項目が欠落しているように見えるが、例外がスローされないため、同時変更が発生していると思われる場合もあります。ConcurrentModificationException
のドキュメントには信頼できないと書かれていることは知っていますが、リストを同時に変更していないことを確認するにはどうすればよいですか? また、コレクションへのすべてのアクセスを同期ブロックでラップすることが、それを防ぐ唯一の方法ですか?
更新:はい、私は について知ってCollections.synchronizedCollection
いますが、コレクションを反復している間に誰かがコレクションを変更するのを防ぎません。コレクションを繰り返し処理しているときに誰かがコレクションに何かを追加すると、少なくとも私の問題の一部が発生していると思います。
2 番目の更新 Jason が行ったように、synchronizedCollection とクローン作成の言及を、java.util.concurrent と jacekfoo や Javamann のような apache コレクション フレームワークの言及と組み合わせたい場合、私は答えを受け入れることができます。