Veränderliche Liste in Scala

Suraj P 21 Juni 2023
  1. DoubleLinkedList in Scala
  2. LinkedList in Scala
  3. ListBuffer in Scala
Veränderliche Liste in Scala

In diesem Artikel lernen wir veränderliche Listen in Scala kennen. Standardmäßig sind Listen in Scala unveränderliche Mittel, sobald sie initialisiert sind, können sie nicht aktualisiert werden, aber Scala bietet viele veränderliche Listen.

Schauen wir sie uns nacheinander an.

DoubleLinkedList in Scala

DoubleLinkedList in Scala ist eine verkettete Liste mit zwei Referenzen, prev und next, um zum vorherigen oder nächsten Knoten zu gehen; Wenn wir zwei Referenzen haben, können wir die Liste hin und her durchlaufen.

Schauen wir uns ein Beispiel an.

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

    }
}

Ausgang:

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

LinkedList in Scala

LinkedList in Scala wird verwendet, um eine einzelne verknüpfte Liste zu erstellen, daher haben wir hier keinen prev-Zeiger. Es wird verwendet, wenn wir zum nächsten Knoten traversieren möchten, der nur in einer Richtung liegt.

Hier können wir also Links erstellen und sie nach Bedarf ändern.

Beispielcode:

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();

}

Ausgang:

100 -> 200 -> 300

DoubleLinkedList und LinkedList werden verwendet, um komplexere Listenstrukturen wie mutable.Queues und mutable.lists zu erstellen.

ListBuffer in Scala

ListBuffer ist, wie der Name schon sagt, eine Buffer-Implementierung, die von einer Liste unterstützt wird. Der Hauptvorteil seiner Verwendung besteht darin, dass es die meisten Operationen in linearer Zeit ausführt.

Operationen wie Anhängen und Voranstellen. Daher wird es häufig verwendet, um eine Liste zu implementieren, wenn sie veränderlich sein soll.

Da die Liste unveränderlich ist, verwenden wir ListBuffer, wenn wir eine Liste haben wollen, die sich häufig ändert. Um ListBuffer zu verwenden, müssen wir scala.collection.mutable.ListBuffer in unser Programm importieren.

Syntax:

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

OR

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

Einige der üblichen Operationen, die auf einem ListBuffer ausgeführt werden, sind:

  1. Wir können LB+=element verwenden, um ein Element in konstanter Zeit anzuhängen.
  2. Wir können LB+=:Buffer verwenden, um ein Element in konstanter Zeit voranzustellen.
  3. Wenn wir mit unserer Liste fertig sind, können wir mit LB.toList den ListBuffer (veränderlich) in konstanter Zeit in List (unveränderlich) umwandeln.

Beispielcode:

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)

    }
}

Ausgang:

ListBuffer(dragonFruit, Apple, Orange)
List(dragonFruit, Apple, Orange)
Autor: 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

Verwandter Artikel - Scala List