こんにちは!過去数回のレッスンで、ArrayList の習得において大きな進歩が見られました。ただし、この間は削除、挿入、コンソールへの出力という最も単純な操作のみを実行しました。もちろん、開発者がArrayList を使用するときに直面する問題のリストはこれで終わりではありません。配列とArraysクラスについての講義を覚えていますか? これは、プログラマーが配列を操作するときに遭遇する一般的な問題を解決するために、Java の作成者によって特別に開発されました。ArrayListについてはどうですか? 確かに、彼の典型的なタスクのリストもいくつかあります。それらはすべて別のクラスに実装されているのでしょうか、それとも毎回目的の動作を手動で記述する必要があるのでしょうか? もちろん、すべてを自分で書く必要はありません。Java でコレクションを使用するときに実行される最も一般的な操作は、特別な静的クラス Collections にすでに実装されています。
Java のコレクション
「コレクション」は、Java のいくつかのデータ構造の総称です。データはさまざまな方法で保存できます。これまでのところ、データが配列に格納されるArrayList クラスについてのみ学習してきました。残りのコレクションについては後ほど説明します。ここでは、Collections クラスが ArrayList だけでなく、Java の他のタイプのコレクション (実際、その名前が付けられている) でも機能するように設計されていることを理解するだけで十分です。では、ArrayList を使用する場合、Collections クラスを使用するとどのようなタスクを解決できるでしょうか? 最初の最も明白な方法は並べ替えです。配列の講義では数値を使った例を見ましたが、今度は文字列を使った例を見てみましょう。コレクションの内容を並べ替えるために、Collections クラスは次のメソッドを実装しますsort()
。
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune));
Collections.sort(solarSystem);
System.out.println(solarSystem);
}
}
結論:
[Венера, Земля, Марс, Меркурий, Нептун, Сатурн, Уран, Юпитер]
行はアルファベット順にソートされています。なぜアルファベット順なのでしょうか?このクラスは、String
文字列がどのように相互に比較されるかを正確に (正確にアルファベット順に) 決定するようにプログラムされています。自分で作成するクラスの場合は、独自の比較メカニズムを実装できますが、これについては他の講義で説明します。さらに、Collections クラスを使用すると、 内の最小要素と最大要素を見つけることができますArrayList
。min()
これは、およびメソッドを使用して行われますmax()
。
public static void main(java.lang.String[] args) {
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
System.out.println(Collections.max(numbers));
System.out.println(Collections.min(numbers));
}
結論:
7
1
もちろん、これは、すべての要素を調べて最大/最小の要素を検索するコードを手動で記述するよりもはるかに便利です :) もう 1 つの非常に便利な方法は、 ですreverse()
。要素が逆の順序になるようにリストを「反転」する必要がある場合、どうすればよいでしょうか? このようなアルゴリズムを自分で書くのは、おそらくそれほど簡単ではないでしょう :) 幸いなことに、このメソッドはreverse()
これを行う方法をすでに知っています。たとえば、このメソッドで惑星がアルファベット順に並べ替えられたのが気に入らずsort()
、順序を逆に、つまり Z から A に変更したいとします。
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune));
Collections.sort(solarSystem);
Collections.reverse(solarSystem);
System.out.println(solarSystem);
}
}
結論:
[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
ちなみに、ここではソートや要素の順序などについてよく話します。私たちのタスクがまったく逆の場合はどうなるでしょうか? たとえば、抽選の仕組みを実装しようとしています。リールに 100 個の数字を追加しました。これらの数字は一度に 1 つずつ画面に表示されます。チケットのすべての番号を最初に取り消した参加者が勝ちとなります。このようなメカニズムは、次のメソッドを使用して実装するのが非常に簡単ですshuffle()
。
public class Main {
public static void main(java.lang.String[] args) {
ArrayList<Integer> lottery = new ArrayList<>(100);
for (int i = 1; i <= 100; i++) {
lottery.add(i);//add numbers from 1 to 100 to the drum
}
Collections.shuffle(lottery);//mix
System.out.println("Attention! The first 10 numbers appear from the drum!");
for (int i = 0; i < 10; i++) {
System.out.println(lottery.get(i));
}
}
}
結論:
Внимание! Из барабана появляются первые 10 чисел!
32
61
4
81
25
8
66
35
42
71
それはとても簡単です!問題は解決され、ゲームの一部が作成されました :) 次に、別の状況を想像してみましょう。solarSystem
以前は、惑星がリストされたリストを作成しました。そして、要素を削除して新しい要素を追加できるという点が 1 つではないにせよ、私たち全員に適しているようです。これは明らかに私たちが期待する動作ではありません。プログラム内の太陽系は変化しない状態にあるはずです。Collections クラスには非常に興味深いメソッドがありますunmodifiableList()
。指定されたリストの不変バージョンを作成します。要素を追加または削除することはできません。太陽系の惑星のリストの場合、これがまさに必要なものです。
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune)));
solarSystem.add("Pluto");//try to add a new element
}
}
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
at Main.main(Main.java:21)
エラー:solarSystem
現在は何も追加できません。この場合に注意する必要があるのは、変数の型が である必要がありList<>
、そうでないことですArrayList<>
(このメソッドは、すべての型のリストに共通で、まさにこの型のオブジェクトを返します)。作業中に発生する可能性のあるもう 1 つの一般的な状況は、プログラマーが要素を間違った順序で追加したことです。これが起こり、水星と海王星の位置が予期せず変わった場合は、次の方法がこの間違いを修正するのに役立ちますswap()
。
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
, jupiter, saturn, uranus, mercury));// wrong planet order
System.out.println(solarSystem);
Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
System.out.println(solarSystem);
}
}
swap()
リストと、交換する必要がある 2 つの要素のインデックスを メソッドに渡しました。注意: このメソッドは、リンクではなく、インデックスに対してのみ機能します。したがって、ここではメソッドが必要でしたArrayList.indexOf()
。結論:
[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]
[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
最後に、非常に興味深い方法を紹介しましょうdisjoint()
。2 つのコレクションに共通部分、つまり少なくとも 1 つの同一の要素があるかどうかをチェックします。そうでない場合は を返しtrue
、ある場合は を返しますfalse
。
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));
System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));
}
}
ご覧のとおり、2 つのリストの要素は完全に異なるため、プログラムは を出力しますtrue
。これはとても面白くてとても役に立つクラスです。同様にArrays
、彼は私たちのために多くの日常的で単純な仕事をしてくれ、私たちが他のことに集中できるようにします。Oracleのドキュメントを参照してください。他の方法もあります。
GO TO FULL VERSION