タグ付けされた質問 「collections」

6
Java 8に不変のコレクションが含まれないのはなぜですか?
Javaチームは、Java 8の関数型プログラミングの障壁を取り除くために多大な努力をしてきました。特に、java.utilコレクションの変更は、変換を非常に高速なストリーム操作に連鎖させるという素晴らしい仕事をしています。彼らがコレクションにファーストクラスの関数と機能メソッドを追加するのをどれだけうまくやったかを考えると、なぜ彼らは不変のコレクションや不変のコレクションのインターフェースを提供することに完全に失敗したのでしょうか? 既存のコードを変更せずに、Javaチームはいつでも変更可能なインターフェイスと同じ不変インターフェイスを追加し、「set」メソッドを削除して、既存のインターフェイスを次のように拡張できます。 ImmutableIterable ____________/ | / | Iterable ImmutableCollection | _______/ / \ \___________ | / / \ \ Collection ImmutableList ImmutableSet ImmutableMap ... \ \ \_________|______________|__________ | \ \___________|____________ | \ | \___________ | \ | \ | List Set Map ... 確かに、List.add()やMap.put()などの操作は現在、指定されたキーのブール値または前の値を返し、操作が成功したか失敗したかを示します。不変のコレクションは、そのようなメソッドをファクトリーとして扱い、追加された要素を含む新しいコレクションを返す必要があります-これは現在の署名と互換性がありません。ただし、ImmutableList.append()または.addAt()およびImmutableMap.putEntry()などの別のメソッド名を使用することで回避できます。結果として得られる冗長性は、不変のコレクションを操作する利点よりも重要であり、型システムは間違ったメソッドを呼び出すエラーを防ぎます。時間が経つにつれて、古いメソッドは廃止される可能性があります。 不変コレクションの勝利: シンプルさ-基礎となるデータが変更されない場合、コードについての推論は簡単です。 ドキュメンテーション-メソッドが不変のコレクションインターフェイスを取る場合、そのコレクションを変更しないことを知っています。メソッドが不変のコレクションを返す場合、変更できないことを知っています。 並行性-不変コレクションはスレッド間で安全に共有できます。 不変性を前提とする言語を味わった人として、Wild延する突然変異のワイルドウエストに戻ることは非常に困難です。Clojureのコレクション(シーケンス抽象化)には、Java …

9
並行性がない場合、不変性は非常に価値がありますか?
不変の型、特にコレクションを使用する主な利点として、スレッドセーフが常に/しばしば言及されているようです。 メソッドが文字列の辞書(C#では不変)を変更しないようにしたい状況があります。できるだけ物事を制約したいと思います。 ただし、新しいパッケージ(Microsoft Immutable Collections)に依存関係を追加する価値があるかどうかはわかりません。パフォーマンスも大きな問題ではありません。 したがって、私の質問は、ハードパフォーマンス要件がなく、スレッドセーフの問題がない場合に、不変コレクションを強く推奨するかどうかだと思いますか?値のセマンティクス(私の例のように)も要件である場合とそうでない場合があることを考慮してください。

6
Javaコレクションを意味のあるクラス名でマスクする良い習慣か悪い習慣ですか?
最近、私は人間に優しいクラス名でJavaコレクションを「マスキング」する習慣を身につけています。いくつかの簡単な例: // Facade class that makes code more readable and understandable. public class WidgetCache extends Map<String, Widget> { } または: // If you saw a ArrayList<ArrayList<?>> being passed around in the code, would you // run away screaming, or would you actually understand what it is and what // it …

8
java.util.ArrayListでnullを追加できるのはなぜですか?
なぜjava.util.ArrayList追加できるのだろうかnull。に追加nullしたいケースはありますArrayListか? プロジェクトにバグがあり、そこにコードが追加さnullれていて、バグの場所ArrayListを見つけるのが難しいため、この質問をしています。明らかにa NullPointerExceptionがスローされましたが、他のコードが要素にアクセスしようとするまではスローされませんでした。問題は、nullオブジェクトを追加したコードを見つける方法でした。ArrayList要素が追加されているコードで例外をスローすると、もっと簡単になります。

9
メソッドで空のコレクションを受け入れる必要がありますか?
メソッドのパラメーターを反復処理するforeachループ内ですべてのロジックが実行されるメソッドがあります。 public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } この場合、空のコレクションを送信すると空のコレクションになりますが、それは賢明ではないのでしょうか。 ここでの私のロジックは、誰かがこのメソッドを呼び出している場合、データを渡すことを意図し、誤った状況でのみ空のコレクションをメソッドに渡すことです。 この動作をキャッチして例外をスローする必要がありますか、空のコレクションを返すのがベストプラクティスですか?

6
「究極のシャッフル」アルゴリズムを作成して、mp3コレクションを並べ替えたい
私は、タイトルとアーティストの重複を避ける方法でmp3ファイルをソートするための擬似コードの提案を探しています。私はクルーナーに耳を傾けます-フランク・シナトラ、トニー・ベネット、エラ・フィッツジェラルドなど、古い基準を歌います。各アーティストは、同じ曲を多数録音します-フライミートゥザムーン、ザウェイユールックトゥナイト、スターダストなど。2000曲あり、20曲がEllaのものである場合、100曲ごとに1回だけ聞きたいです。10人のアーティストがFly Me To The Moonを歌うなら、200曲に1回聴きたいです。もちろん、これら2つの要件を組み合わせて、「究極のシャッフル」を作成します。 これはかなり広範にわたる未解決の質問です。まだプログラミングを始めていませんので、良いアプローチの提案を探しています。実際には、他の曲の属性を均等に配置することに関して他のいくつかの要件がありますが、ここではそれに入りません。 出発点として、ここで見つけたコードを変更して、mp3ファイルを操作し、ID3タグを読み取ります。 以下のparsifalの回答を使用して、私のニーズを満たす小さなアプリを作成しました。ここにフォローアップの質問も書きました。素晴らしい反応をありがとう!

2
Java:なぜコレクションはComparatorを受け入れますが、(仮想的な)HasherとEquatorを受け入れませんか?
この問題は、インターフェイスのさまざまな実装があり、特定のコレクションの目的のために、オブジェクトのインターフェイスレベルのビューのみに関心がある場合に最も顕著です。たとえば、次のようなインターフェイスがあるとします。 public interface Person { int getId(); } クラスを実装hashcode()および実装する通常の方法equals()では、equalsメソッドに次のようなコードが含まれます。 if (getClass() != other.getClass()) { return false; } あなたがの実装混ぜるときに問題が発生Person中をHashMap。がHashMapのインターフェイスレベルのビューのみに関心がある場合、Person実装クラスのみが異なる重複が発生する可能性があります。 equals()すべての実装で同じリベラルな方法を使用してこのケースを機能させることはできますが、その後equals()、異なるコンテキストで間違ったことを行うリスクが発生します(Personデータベースレコードに裏付けられた2つのsをバージョン番号と比較するなど)。 私の直感では、平等はクラスごとではなくコレクションごとに定義する必要があると教えられています。順序に依存するコレクションを使用する場合、カスタムComparatorを使用して各コンテキストで正しい順序を選択できます。ハッシュベースのコレクションに類似するものはありません。どうしてこれなの? 明確にするために、この質問は、コレクションの実装を処理するため、「。equals()がJavaのクラスにあるのに、なぜ.compareTo()がインターフェイスにあるのか」とは異なります。compareTo()およびequals()/ hashcode()両方ともコレクションを使用する際の普遍性の問題に苦しんでいます:コレクションごとに異なる比較関数を選ぶことはできません。したがって、この質問の目的上、オブジェクトの継承階層はまったく問題ではありません。重要なのは、比較関数がオブジェクトごとに定義されているか、コレクションごとに定義されているかです。
25 java  collections 

1
.Netの配列にはLengthがあるのに、他のコレクションタイプにはCountがあるのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 たとえば、C#では、配列にLengthプロパティがあります。ただし、リストなどの他のコレクションタイプにはCountプロパティがあります。これら2つが異なる理由はありますか?もしそうなら、私は知りたいです。

7
「Set」にはGetメソッドが必要ですか?
このC#クラスを作成しましょう(Javaでもほぼ同じです)。 public class MyClass { public string A {get; set;} public string B {get; set;} public override bool Equals(object obj) { var item = obj as MyClass; if (item == null || this.A == null || item.A == null) { return false; } return this.A.equals(item.A); } public override int GetHashCode() …

4
PUTまたはDELETEでコレクションを部分的に変更しても大丈夫ですか?
製品グループに製品のコレクションがあります。例: product-groups/123/products コレクションに追加する必要がある場合、PUTを使用して一部の製品のみを渡すことはできますか? コレクションからいくつかの製品を削除する必要がある場合、フィルターデータ(IDの配列)をDELETEで渡しても大丈夫ですか? ReSTの精神で機能を実装する最良の方法は何ですか? 編集:アイテムは個別のエンティティ、基本的には製品のIDへのリンクです。
21 rest  collections 

5
オブジェクトをシャッフルする効率的な方法
クイズソフトウェアのプログラムを書いています。質問、回答、オプション、マーク、ネガティブマークのArrayListを含む質問クラスがあります。このようなもの: class question { private ArrayList<Integer> index_list; private ArrayList<String> question_list; private ArrayList<String> answer_list; private ArrayList<String> opt1_list; private ArrayList<String> opt2_list; } すべての質問をシャッフルしたいのですが、質問をシャッフルするには、すべてのオブジェクトをシャッフルする必要があります。私はこの方法でこの問題に取り組みました。 まず、このデザインを使用せずArrayList<String>、インスタンス変数としてStringではなく型を使用し、Collections.shuffleオブジェクトをシャッフルするメソッドを使用します。しかし、私のチームはこの設計を主張しています。 現在、質問へのエントリが作成されるにつれて、質問クラスには増加するArrayListが含まれています。今すぐ質問をシャッフルする方法は?
20 java  collections 

3
コレクションを通常返す場所にストリームを返すのは正気ですか?
レガシーコードに関連付けられていないAPIを開発しているとき、結果を収集することで純粋にStreamsパイプラインで終了するメソッドを作成していることがよくあります。このように: ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfThing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey) .collect(MyCustomCollectors.toImmutableSet()); } さて、このクラスのほとんどのクライアントは通常、要素を検索してそれを反復処理するためにコレクション(この場合はImmutableSet)を必要としますが、一部のクライアントはその上にいくつかの操作をパイプできるようにストリームを持つことで利益を得ることができますコレクションから新しいストリームを取得する必要のないストリーム。したがって、ストリームを返すと、コレクションを持っている場合のオプションのスーパーセットがクライアントに提供されます(結局、常にcollect()ストリーム自体を使用できます: Stream<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfthing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey); // No collect } このアプローチは、潜在的な欠陥が見当たらないため、試してみたいと思います。しかし、どのライブラリでもこのアプローチを見たことはありません(おそらく、Java 8の登場後にリリースされたライブラリが多くなかったためです)。既存のライブラリクラスは、通常、プライベート状態から何かを派生するときにコレクションを返します。 Java 8より前の自分がコレクションを返す場所にストリームを返すことにした場合に発生する可能性のある悪いことがありますか?または、私はここで私的状態から派生したすべてのものでアンチパターンの何かをしていますか?

3
テストのロジックを回避しながらコレクションを返すメソッドを単体テストする方法
データオブジェクトのコレクションを生成する方法をテスト駆動しています。オブジェクトのプロパティが正しく設定されていることを確認したい。一部のプロパティは同じものに設定されます。その他は、コレクション内での位置に依存する値に設定されます。これを行う自然な方法は、ループを使用するようです。ただし、Roy Osheroveは単体テストでロジックを使用しないことを強くお勧めします(Art of Unit Testing、178)。彼は言い​​ます: ロジックを含むテストは、通常、一度に複数のテストを行いますが、テストは読みにくく、壊れやすいため、お勧めできません。しかし、テストロジックは、隠れたバグを含む可能性のある複雑さも追加します。 テストは、一般的なルールとして、でなく、制御フローのない一連のメソッド呼び出しtry-catch、およびアサート呼び出しである必要があります。 ただし、デザインに問題はありません(データオブジェクトのリストを生成する方法はありますが、値の一部はシーケンスのどこに依存しますか?-個別に生成してテストすることはできません)。私のデザインにはテストに適さないものがありますか?または、オセロベの教えにあまりにも厳格に専念していますか?または、この問題を回避することについて私が知らない秘密のユニットテストマジックがありますか?(私はC#/ VS2010 / NUnitで書いていますが、可能であれば言語に依存しない答えを探しています。)

5
C ++よりも高速なJavaヒープ割り当て
私はすでにこの質問をSOに投稿しましたが、大丈夫でした。それは残念ながら閉じられました(再開するには1票しか必要ありません)が、誰かが私がここに投稿することを提案したので、それはより適切なので、以下は文字通り質問のコピーペーストです この答えに関するコメントを読んでいたこの引用を見ました。 オブジェクトのインスタンス化とオブジェクト指向の機能は、最初から設計されているため、非常に高速です(多くの場合、C ++よりも高速です)。コレクションは高速です。ほとんどの最適化されたCコードであっても、標準Javaはこの領域で標準C / C ++に勝ります。 あるユーザー(私が追加する可能性のある非常に高い担当者)は、この主張を大胆に擁護し、 Javaでのヒープ割り当てはC ++よりも優れています Javaでコレクションを守るこのステートメントを追加しました また、主にメモリサブシステムが異なるため、JavaコレクションはC ++コレクションに比べて高速です。 だから私の質問はこれのどれでも本当に真実でありえ、もしそうなら、なぜJavaのヒープ割り当てがそんなに速くなるのかということです。

2
Javaコレクション(java.util)のパッケージ構造-Iterableがjava.langにあるのはなぜですか?
以下の図のように、interfaceを除いてIterable、残りのすべての構成要素(interface / class / abstract class)は同じパッケージにありますjava.util パッケージにIterable座っているのはなぜjava.langですか? 注:意図は、Javaプログラミングのパッケージングの側面を理解することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.