大数据每日一篇Scala每日一篇大数据

Scala(七)-①-数据结构-集合-Array和List和Li

2018-11-20  本文已影响5人  sixleaves

Java中不可变集合

  • 不可变集合概念(java为例)
public class ImmutableDemo01ForJava {
   public static void main(String[] args) {
       // 1.不可变集合,内容可变,旦数组本身不能动态增长
       int []nums = new int[3];
       nums[2] = 2;
       //  nums[3] = 1  错误

       // 2.可变集合,集合本省能够动态增长
ArrayList arrayList = new ArrayList<String>();
       arrayList.add("t1");
       System.out.println(arrayList.hashCode());
       arrayList.add("t2");
       System.out.println(arrayList.hashCode());
   }
}

Scala中的集合

特点

两个主要的包:
不可变集合:scala.collection.immutable
可变集合: scala.collection.mutable

举个例子

不可变集合继承层次一栏图

image.png

可变集合继承层次一栏图

image.png

细节

① 数组

Why

Scala同时支持不可变集合可变集合.不可变集合是线程安全的.

How

定长数组-Array

创-方式一-new Array
/**
  * @author sweetcs
  */
object ArrayDemo01 {
  def main(args: Array[String]): Unit = {

    // 默认为零
    var arr = new Array[Int](4)
    println("数组长度=" + arr.length)
    println("循环遍历数组:")
    for (item <- arr) {
      println(item)
    }

    arr(3)=1
    
    println("循环遍历数组:")
    for (item <- arr) {
      println(item)
    }

  }
}
创-方式二-Array
/**
  * @author sweetcs
  */
object ArrayDemo02ForApply {
  def main(args: Array[String]): Unit = {
    // 数组元素的类型时Any.一旦定义就不可在更改
    var array = Array(1, 2, "beijing")

    // 数组元素的类型时Int.一旦定义就不可在更改
    var arrayOfInts = Array(1,2)


    for (item <- array) {
      println(item)
    }

    // 传统for循环基于索引遍历
    var len = array.length
    for (i <- 0 until len) {
      printf("%s\t", array(i))
    }
  }
}

变长数组-ArrayBuffer

创-变长数组的增删改查
/**
  * @author sweetcs
  */
object MutableArrayDemo01 {
  def main(args: Array[String]): Unit = {
    
    val arrayBuffer = ArrayBuffer[Any](2,3,"beijing")
    println(arrayBuffer(2))

    println(arrayBuffer.hashCode())
    // 增
    arrayBuffer.append(5, 6)
    println(arrayBuffer.hashCode())

    // 删
    arrayBuffer.remove(0)
    // 查
    for (item <- arrayBuffer) {
      print(item + "\t")
    }
  }
}

定长数组和变长数组的转换

/**
  * @author sweetcs
  */
object MutableArrayDemo02ForTranslateImutable {
  def main(args: Array[String]): Unit = {

    val arrayBuffer = ArrayBuffer(1,2,"beijing")
    val array = arrayBuffer.toArray
    println(array.hashCode(), arrayBuffer.hashCode())
    println("遍历不可变数组")
    for (item <- array) {
      println(item)
    }

    val mutableArray = array.toBuffer
    mutableArray.append(3)
    println("遍历mutableArray")
    for (item <- mutableArray) {
      println(item)
    }

    println("遍历arrayBuffer")
    for (item <- arrayBuffer) {
      println(item)
    }
  }
}

多维数组

语法
// 创建一个3行四列的Double数组
val arr = Array.ofDim[Double](3,4)
多维数组Demo
/**
  * @author sweetcs
  */
object ArrayDemo05ForMultiplyDimArray {
  def main(args: Array[String]): Unit = {

    val arr = Array.ofDim[Int](3, 4)

    // 查
    println("查case==========")
    for (row <- arr) {
      println(row)
      for (col <- row) {
        println(col + "\t")
      }
    }

    println("改case==========")
    // 改
    arr(0)(1) = 3
    for (row <- arr) {
      println(row)
      for (col <- row) {
        println(col + "\t")
      }
    }

  }
}

Java数组(List)和Scala数组(ArrayBuffer)的互转

object ArrayDemo06ForScalaArrayToJavaArray {

  def main(args: Array[String]): Unit = {

    //创建了ArrayBuffer
    val arr = ArrayBuffer("1", "2", "3")

    //下面的import 引入了我们需要的隐式函数【这里就是隐式函数的应用】
    //implicit def bufferAsJavaList[A](b : scala.collection.mutable.Buffer[A]) : java.util.List[A]
    import scala.collection.JavaConversions.bufferAsJavaList

    // 触发隐式转换
    val javaArr = new ProcessBuilder(arr)

    //返回的是 List<String>
    val arrList = javaArr.command()

    println(arrList) //输出 [1, 2, 3]
  }
}

object ArrayDemo07ForJavaArrayToScalaArray {
  def main(args: Array[String]): Unit = {

    val arrList = new java.util.ArrayList[String]()

    import scala.collection.JavaConversions.asScalaBuffer
    import scala.collection.mutable
    // java.util.List ==> Buffer
    val scalaArr: mutable.Buffer[String] = arrList
    scalaArr.append("jack")
    scalaArr.append("tom")
    println(scalaArr)
    scalaArr.remove(0)
    println(scalaArr) // (2,3,jack,tom)

  }
}

What

  override def toBuffer[A1 >: A]: mutable.Buffer[A1] = {
    val result = new mutable.ArrayBuffer[A1](size)
    copyToBuffer(result)
    result
  }

Details


② 元组

Why

How

元组语法

使用小括号标识元组.

val t = (1,23,"we are")
元组DEMO
object TupleDemo01 {
  def main(args: Array[String]): Unit = {

    val tuple1 = (1,2,3,4,"hello")
    println(tuple1, tuple1.getClass) // ((1,2,3,4,hello),class scala.Tuple5)

  }
}
object TupleDemo02ForAccess {
  def main(args: Array[String]): Unit = {

    val tuple = (1, 2, 3, "beijing")

    println(tuple._1)
    println(tuple.productElement(0))

    println("元组的遍历")
    // 元组遍历,要用迭代器
    for (item <- tuple.productIterator) {
      println(item)
    }

  }
}

What

元组的访问-索引方式(0开始)原理
  @throws(classOf[IndexOutOfBoundsException])
  override def productElement(n: Int) = n match { 
    case 0 => _1
    case 1 => _2
    case 2 => _3
    case 3 => _4
    case _ => throw new IndexOutOfBoundsException(n.toString())
 }

Details


③ List

Why

List是Seq的子类,用于按序存放元素.

How

不可变List

 val list = List(1, 2, 3, "beijing")
/**
  * @author sweetcs
  */
object ListDemo02ForAppendAndReturnNewList {
  def main(args: Array[String]): Unit = {
    val list = List(1, 2, 3, "beijing")

    // 在列表的最后追加
    val newList = list :+ 6

    // 在列表的头追加
    val newList02 = 6 +: list
    println(s"list hashcode = ${list.hashCode()}, newList = ${newList.hashCode()}, newList02 = ${newList02.hashCode()}")
    println("newList= " + newList)
    println("newList02= " + newList02)
  }
}

输出

list hashcode = -1049219423, newList = 173175143, newList02 = -1337286218
newList= List(1, 2, 3, beijing, 6)
newList02= List(6, 1, 2, 3, beijing)
object ListDemo02ForAppendAndReturnNewList {
  def main(args: Array[String]): Unit = {
    val list = List(1, 2, 3, "beijing")

    // 在列表的最后追加
    val newList = list :+ 6

    // 使用::添加元素, 会将一个集合当成一个整体放入集合中.
    // 使用:::添加元素, 会将一个集合中的元素都依次添加进去
    val newList03 = 4 :: 5 :: 6 :: 7 :: list :: Nil
    println(newList03)


    val newList04 = 4 :: 5 :: 6 :: 7 :: list ::: Nil
    println(newList04)
  }
}

可变list-ListBuffer

ListBuffer是可变的list集合, 可以添加, 删除元素,ListBuffer属于序列

object ListDemo03ForListBuffer {
  def main(args: Array[String]): Unit = {
    val lst0 = ListBuffer[Int](1, 2, 3)
    //如何访问
    println("lst0(2)=" + lst0(2)) // 输出 lst0(2)= 3
    for (item <- lst0) { // 遍历,是有序
      println("item=" + item)
    }

    //动态的增加元素,lst1就会变化, 增加一个一个的元素
    val lst1 = new ListBuffer[Int] //空的ListBuffer
    lst1 += 4 // lst1 (4)
    lst1.append(5) // list1(4,5)

    //
    lst0 ++= lst1 // lst0 (1, 2, 3,4,5)

    println("lst0=" + lst0)


    val lst2 = lst0 ++ lst1 // lst2(1, 2, 3,4,5,4,5)
    println("lst0=" + lst0)
    println("lst2=" + lst2)

    val lst3 = lst0 :+ 5 // lst0 不变 lst3(1, 2, 3,4,5,5)
    println("lst3=" + lst3)


    println("=====删除=======")
    println("lst1=" + lst1)
    lst1.remove(1) // 表示将下标为1的元素删除
    for (item <- lst1) {
      println("item=" + item) //4
    }

  }
}

Details

上一篇下一篇

猜你喜欢

热点阅读