リンクリストの単一のインデックスに複数のデータ項目を保存しますか?
-
06-07-2019 - |
質問
リンクリストの単一のインデックスに複数のデータ項目を保存しようとしています。私の教科書の例はすべて、インデックスごとにデータを1つだけ追加することを示しているようです。さらに追加することは可能だと思いますか?
たとえば、コレクションAPIを使用して整数を保存するには、次のようにします。
LinkedList <Integer>linky = new LinkedList<Integer>();
int num1 = 2, num2 = 22, num3 = 25, num4 = 1337;
linky.add(num1);
num2、num3、num4をリストの同じ最初のインデックスに追加するにはどうすればよいですか?みんなありがとう。
解決
リンクリストの動作について少し混乱しているようです。基本的に、リンクリストはノードで構成され、各ノードには1つのデータ(正確には複数のメンバー変数を含むことができるオブジェクト)と、リスト内の次のノードへのリンク(または、存在する場合はNULLポインター)が含まれますそのような次のノードはありません)。また、特定の種類のアクセスパターンを高速化するために、各ノードにリスト内の前のノードへのポインターがある二重リンクリストを作成することもできます。
複数の<!> quot;データの一部<!> quot;を追加するには1つのノードに複数のリンクを1つのノードから追加するように聞こえます。これにより、リンクされたリストがN項のツリーになります。
リンクリストに最も一般的に関連付けられている方法で、リストの最後に複数のデータを追加するには、次のようにします。
LinkedList <Integer>linky = new LinkedList<Integer>();
int num1 = 2, num2 = 22, num3 = 25, num4 = 1337;
linky.add(num1);
linky.add(num2);
linky.add(num3);
linky.add(num4);
代わりに、リンクリストの各ノードに複数のデータを持たせたい場合
これらのデータは、オブジェクトにパッケージ化する必要があります(すべてをメンバー変数として含むclass
を定義することにより)。例:
class GroupOfFourInts
{
int myInt1;
int myInt2;
int myInt3;
int myInt4;
public GroupOfFourInts(int a, int b, int c, int d)
{
myInt1 = a; myInt2 = b; myInt3 = c; myInt4 = d;
}
}
class someOtherClass
{
public static void main(String[] args)
{
LinkedList<GroupOfFourInts> linky = new LinkedList<GroupOfFourInts>();
GroupOfFourInts group1 = new GroupOfFourInts(1,2,3,4);
GroupOfFourInts group2 = new GroupOfFourInts(1337,7331,2345,6789);
linky.add(group1);
linky.add(group2);
}
}
現在、linky
には2つのノードがあり、それぞれに4つのint
s、 myInt1 、 myInt2 、 myInt3 が含まれます、および myInt4 。
注
上記のどれもリンクリストに固有のものではありません。このパターンは、大量のデータを1つの単位として一緒に保存する場合に使用する必要があります。一緒に保存するすべてのデータのメンバー変数を持つクラスを作成し、そのタイプのJavaコレクションタイプ(ArrayList、LinkedList、TreeListなど)を作成します。
リンクリストを使用することを確認してください(ArrayListまたはTreeListを選択する際のプログラミングの難しさのペナルティはありません)。これは、データアクセスパターンによって異なります。リンクリストはO(1)の追加と削除を提供しますが、O(n)ルックアップを提供し、ArrayListsはO(1)の検索を提供しますが、O(n)任意の追加と削除を提供します。 TreeListは、O(log n)の挿入、削除、およびルックアップを提供します。これらの間のトレードオフは、所有するデータの量と、データ構造を変更してアクセスする方法によって異なります。
もちろん、リストに<!> lt; 100個の要素しか含まれていない場合、これは重要ではありません;-)
これがお役に立てば幸いです!
他のヒント
構造を使用します。
例:
private struct Node
{
int Num1;
int Num2;
int Num3;
}
...
LinkedList<Node> list = new LnkedList<Node>();
Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.Add(n);
注;これはC#であると想定しています。私が間違っていてコードを修正したら修正してください;)
あなたが本の中でまだOOPを行っていないなら、試してみることをお勧めします。このような問題の解決に役立ちます。
そのようなものではない理由:
LinkedList<LinkedList<Integer>> linky = new LinkedList<LinkedList<Integer>>();
//...
linky.add(new LinkedList<Integer>().add( //...
クラスの使用が必要ですが、別のオブジェクトが必要です。 作業中のクラスの外部で「ノード」クラスを使用する必要がある場合は、それをPublicクラスにして、独自のファイルに移動する必要があります。
private Class Node
{
//You might want to make these private, and make setters and getters
public int Num1;
public int Num2;
puclic int Num3;
}
LinkedList<Node> list = new LinkedList<Node>();
Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.Add(n);
コードを盗んだネルソンに謝罪;)
リンクリストに構造を追加する方法を示す完全なコードサンプルを次に示します。
import java.util.LinkedList;
class Node {
int num1;
int num2;
int num3;
int num4;
public Node(int a, int b, int c, int d) {
num1 = a; num2 = b; num3 = c; num4 = d;
}
}
public class dummy {
public static void main(String[] args) {
LinkedList <Node>linky = new LinkedList<Node>();
x myNode = new Node(2, 22, 25, 1337);
linky.add(myNode);
}
}
あなたが達成しようとしていることを本当に理解していないので、問題の別の読み方(java)の解決策を提案します。
LinkedList <Integer>linky = new LinkedList<Integer>();
linky.add(num1);
// Lots of code possibly adding elements somewhere else in the list
if (linky.size() > 0) { // Always good to be sure; especially if this is in another methode
int first = linky.get(0);
linky.set(0, first + num2);// Value of linky.get(0) is num1 + num2
}
// The same again
// Lots of code possibly adding elements somewhere else in the list
if (linky.size() > 0) { // Always good to be sure; especially if this is in another methode
int first = linky.get(0);
linky.set(0, first + num3); // Value of linky.get(0) is num1 + num2 + num3
}
個人的には、追加する数字の量が一定(num1 .. num4)である場合、Nelsonのソリューションが最も好きです。 そして、それが一定でない場合は、ノードの代わりにリストを使用するグレゴールのソリューションを好むでしょう。 JavaのNodeメソッドを使用する場合は、次をお勧めします。
// added static, Class to class
private static class Node
{
//You might want to make these private, and make setters and getters
public int Num1;
public int Num2;
puclic int Num3;
}
// Prefer interfaces if possible
List<Node> list = new LinkedList<Node>();
Node n = new Node();
n.Num1 = 10;
n.Num2 = 100;
n.Num3 = 1000;
list.add(n); // Add -> add
多くのnitpickingですが、可能であれば、静的でないプライベートクラスの代わりに静的クラスが優先されると思います(通常は可能です)。