Scala の可変リスト

Suraj P 2023年6月21日
  1. Scala の DoubleLinkedList
  2. Scala のLinkedList
  3. ScalaのListBuffer
Scala の可変リスト

この記事では、Scala の可変リストについて学びます。 デフォルトでは、Scala のリストは不変であるため、一度初期化すると更新できませんが、Scala は多くの可変リストを提供します。

それらを1つずつ見てみましょう。

Scala の DoubleLinkedList

Scala の DoubleLinkedList は、前のノードまたは次のノードに移動するための prevnext の 2つの参照を持つリンクされたリストです。 2つの参照があると、リストを行き来することができます。

例を見てみましょう。

object MyClass {


class Node(var data: Int,var prev: Node, var next: Node)
{
	def this(data: Int)
	{
		this(data, null, null)
	}
}

class DoublyLinkedList(var head:Node,var tail: Node)
{
	def this()
	{
		this(null, null)
	}

	def insert(x: Int): Unit = {

		var node:Node = new Node(x);
		if (this.head == null)
		{
			this.head = node;
			this.tail = node;
			return;
		}
		this.tail.next = node;
		node.prev = this.tail;
		this.tail = node;
	}

    def show(): Unit = {

		if (this.head == null)
		{
			println("List is empty");
		}
		else
		{
			print("\nPrinting list from front to back :\n");


			var first: Node = this.head;


			while (first!= null)
			{
				print("  " + first.data);

				first = first.next;
			}
			print("\nPrinting list from back to front:\n");

		var last: Node = this.tail;

			while (last!= null)
			{
				print("  " + last.data);

				last = last.prev;
			}
		}
	}
}

    def main(args: Array[String])
    {
      var dll: DoublyLinkedList = new DoublyLinkedList();
		dll.insert(100);
		dll.insert(200);
		dll.insert(300);
		dll.insert(400);

		dll.show(); //to print the list

    }
}

出力:

Printing list from front to back :
  100  200  300  400
Printing list from back to front:
  400  300  200  100

Scala のLinkedList

Scala の LinkedList は単一のリンク リストを作成するために使用されるため、ここには prev ポインタはありません。 一方向のみの次のノードにトラバースしたい場合に使用します。

ここで、リンクを作成し、必要に応じて変更できます。

コード例:

case class LinkedList[obj]()
{
  var head: node[obj] = null;

  def insert(myData: obj) = {
    head match {
      case null => head = new node(myData,null)

      case _ =>
      {
        var end:node[obj] = head;

        while (end.next!= null) {
          end = end.next;
        }

        end.next = new node[obj](myData, null);
      }
    }
  }


  def display()
  {
    if (head != null) {
      head.displayLinkedList();
    }
    println();
  }



}

sealed case class node[obj](var data: obj, var next: node[obj])
{
  def myData: obj = this.data
  def nextPtr: node[obj] = this.next;

  def displayLinkedList(): Unit = {
    print(data)

    if (next!= null) {
      print(" -> ")
      next.displayLinkedList();
    }

  }

}



object Main extends App {

  var list: LinkedList[Int] = new LinkedList();

  list.insert(100);
  list.insert(200);
  list.insert(300);
  list.display();

}

出力:

100 -> 200 -> 300

DoubleLinkedListLinkedList は、mutable.Queuesmutable.lists などのより複雑なリスト構造を作成するために使用されます。

ScalaのListBuffer

ListBuffer は、名前が示すように、リストに基づく Buffer 実装です。 これを使用する主な利点は、ほとんどの線形時間操作を実行できることです。

append や prepend などの操作。 したがって、変更可能にしたい場合にリストを実装するために広く使用されています。

リストは不変であるため、頻繁に変化し続けるリストが必要な場合は、ListBuffer を使用します。 ListBuffer を使用するには、scala.collection.mutable.ListBuffer をプログラムにインポートする必要があります。

構文:

var one = new ListBuffer[data_type]() //this creates empty buffer

OR

var two = new ListBuffer("apple","orange","watermelon")

ListBuffer で実行される一般的な操作の一部は次のとおりです。

  1. LB+=element を使用して一定時間内に要素を追加できます。
  2. LB+=:Buffer を使用して、要素を一定時間前に追加できます。
  3. リストの処理が完了したら、LB.toList を使用して ListBuffer (可変) を List (不変) に一定時間で変換できます。

コード例:

import scala.collection.mutable.ListBuffer

object MyClass {


    def main(args: Array[String]) {
         var lb = ListBuffer[String]()

         lb+= "Apple";
         lb+= "Orange";
         "dragonFruit"+=:lb  //prepending

         println(lb);


		 var result: List[String] = lb.toList
		 println(result)

    }
}

出力:

ListBuffer(dragonFruit, Apple, Orange)
List(dragonFruit, Apple, Orange)
著者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

関連記事 - Scala List