Scala基础篇【下】

上篇:Scala基础篇【中】

一、List的常用方法测试

用例1.1、list集合的使用

代码实现:

package org.apache.scala.day03

/**
 * 描述: List的常用方法测试,用例1
 * 时间: 2021/7/18
 */
object Demo012_ListTest1 {
  def main(args: Array[String]): Unit = {

    //创建一个List
    val list0 = List(1, 7, 9, 8, 0, 3, 5, 4, 6, 2)
    //将list0中每个元素乘以10后生成一个新的集合
    val list1 = list0.map(x => x * 2)
    //结果是:List(2, 14, 18, 16, 0, 6, 10, 8, 12, 4)
    println(list1)
    println(list0(1))

    //将list0中的偶数取出来生成一个新的集合
    val list2 = list0.filter(x => x % 2 == 0)
    //运行结果是:List(8, 0, 4, 6, 2)
    println(list2)

    //将list0排序后生成一个新的集合
    val list3 = list0.sorted
    //运行结果:List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    println(list3)

    val list4 = list0.sortBy(x => x)
    //运行结果:List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    println(list4)

    val list5 = list0.sortWith((x, y) => x < y)
    //运行结果:List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    println(list5)
    println("--------------------------------1----------------------------------")

    //反转顺序
    val list6 = list3.reverse
    //运行结果:List(9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
    println(list6)

    //将Iterator转换成List
    val list7 = list0.toList
    //运行结果是:List(1, 7, 9, 8, 0, 3, 5, 4, 6, 2)
    println(list7)

    //先按空格切分,再压平
    val a = Array("a b c", "d e f", "h i j")
    a.flatMap(_.split(" "))
    //运行结果是:[Ljava.lang.String;@54a097cc
    println(a)

    val value1 = list0.reduce(_ + _)
    //运行结果是:45
    println(value1)

    val value2 = list0.fold(10)(_ + _)
    //运行结果是:55
    println(value2)
    println("--------------------------------2----------------------------------")

    //并行计算求和
    val value3 = list0.par.sum
    //运行结果是:45
    println(value3)

    val value4 = list0.par.map(_ % 2 == 0)
    //运行结果:ParVector(false, false, false, true, true, false, false, true, true, true)
    println(value4)

    val value5 = list0.par.reduce((x, y) => x + y)
    //运行结果:45
    println(value5)

    //简化:reduce
    //将非特定顺序的二元操作应用到所有元素
    val list9 = list0.par.reduce((x, y) => x + y)
    //运行结果是:45
    println(list9)

    //按照特定的顺序
    val list10 = list0.reduceLeft(_ + _)
    //运行结果:45
    println(list10)
    println("--------------------------------3----------------------------------")

    //折叠:有初始值(无特定顺序)
    val list11 = list0.par.fold(100)((x, y) => x + y)
    //运行结果是:945,第二次是1045,最后又回到945
    println(list11)

    //折叠:有初始值(有特定顺序)
    val list12 = list0.foldLeft(100)((x, y) => x + y)
    //运行结果一直是145
    println(list12)

    //聚合
    val arr = List(List(1, 2, 3), List(3, 4, 5), List(2), List(0))
    val result = arr.aggregate(0)(_ + _.sum, _ + _)
    //运行结果:20
    println(result)

    val l1 = List(5, 6, 4, 7)
    val l2 = List(1, 2, 3, 4)
    //求并集
    val r1 = l1.union(l2)
    //结果是:List(5, 6, 4, 7, 1, 2, 3, 4)
    println(r1)

    //求交集
    val r2 = l1.intersect(l2)
    //运行结果:List(4)。并集只有一个4
    println(r2)

    //求差集
    val r3 = l1.diff(l2)
    //求l1中不包含l2元素的集合,运行结果是:List(5, 6, 7)
    println(r3)
  }
}

打印输出:

用例1.2、list的fill、concat方法使用

代码实现:

package org.apache.scala.day03
/**
 * 描述: List的常用方法测试,用例2
 * 时间: 2021/7/18
 */
object Demo012_ListTest2 {

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

    val list1: List[Int] = List.apply(1, 2, 3)
    println(list1)

    val list2: List[Int] = List.range(2, 6)
    val list3: List[Int] = List.range(2, 6, 2)
    val list4: List[Int] = List.range(2, 6, -1)
    println(list2)
    println(list3)
    println(list4)

    val list5: List[String] = List.fill(5)("hey")
    println(list5)

    val list6: List[String] = List.concat(List("a", "b"), List("c"))
    println(list6)
  }
}

打印输出:

用例1.3、list合并新的listBuffer

代码实现:

package org.apache.scala.day03

/**
 * 描述: List的常用方法测试,用例3
 * 时间: 2021/7/18
 */

import scala.collection.mutable.ListBuffer
object Demo012_MutableList extends App{
  //构建一个可变列表,初始有3个元素1,2,3
  val list0 = ListBuffer[Int](1, 2, 3)
  //创建一个空的可变列表
  val list1 = new ListBuffer[Int]
  //向list1中追加元素,注意:没有生成新的集合
  list1 += 4
  list1.append(5)
  println(list1)

  //将list1中的元素最近到list0中, 注意:没有生成新的集合
  list0 ++= list1

  //将list0和list1合并成一个新的ListBuffer 注意:生成了一个集合
  val list2 = list0 ++ list1

  //将元素追加到list0的后面生成一个新的集合
  val list3 = list0 :+ 5
}

打印输出:

用例1.4、集合set方法实现

代码实现:

package org.apache.scala.day03

import scala.collection.immutable.HashSet
/**
 * 描述: List的常用方法测试,用例4
 * 时间: 2021/7/18
 */
object Demo013_ImmutableSet extends App {

  val set1 = new HashSet[Int]()
  //将元素和set1合并生成一个新的set,原有set不变
  val set2 = set1 + 4

  //set中元素不能重复
  val set3 = set1 ++ Set(5, 6, 7)

  val set0 = Set(1, 3, 4) ++ set1
  println(set0.getClass)
}

打印输出:

用例1.5、集合HashSet的使用

代码实现:

package org.apache.scala.day03
import scala.collection.mutable
/**
 * 描述: List的常用方法测试,用例5
 * 时间: 2021/7/18
 */
object Demo013_MutableSet extends App {

  //创建一个可变的HashSet
  val set1 = new mutable.HashSet[Int]()

  //向HashSet中添加元素
  set1 += 2
  //add等价于+=
  set1.add(4)

  set1 ++= Set(1, 3, 5)
  println(set1)

  //删除一个元素
  set1 -= 5
  set1.remove(2)
  println(set1)
}

打印输出:

用例1.6、集合的union、intersect、diff方法使用

代码实现:

package org.apache.scala.day03
/**
 * 描述: List的常用方法测试,用例6
 * 时间: 2021/7/18
 */
object Demo013_SetTest {

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

    val set1: Set[Int] = Set(1, 2, 3, 4, 5)
    val set2: Set[Int] = Set(3, 4, 5, 6, 7)

    println(set1.union(set2))
    println(set1.intersect(set2))
    println(set1.diff(set2), set2.diff(set1))
  }
}

 打印输出:

用例1.7、集合map使用

代码实现:

package org.apache.scala.day03

/**
 * 描述: List的常用方法测试,用例7
 * 时间: 2021/7/18
 */
import scala.collection.mutable
object Demo014_MutableMap extends App {

  val map1 = new mutable.HashMap[String, Int]()

  //向map中添加数据
  map1("spark") = 1
  map1 += (("hadoop", 2))
  map1.put("storm", 3)
  println(map1)

  //从map中移除元素
  map1 -= "spark"
  map1.remove("hadoop")
  println(map1)
  println("----------------------1--------------------------------------------")

  // 访问map1中的key-value
  println(map1("storm"))
  //  println(map1("spark"))
  val result = if (map1.contains("spark")) map1("spark") else 0
  println(result)
  println(map1.get("storm"))
  println(map1.getOrElse("storm", 0))
  println(map1.getOrElse("spark", 0))
  println("----------------------2--------------------------------------------")

  // 遍历
  val map2 = Map("a" -> 1, "b" -> 2, "c" -> 3)
  for (kv <- map2) {
    println(kv._1, kv._2)
  }
  for ((k, v) <- map2) {
    println(k, v)
  }
  println("----------------------3--------------------------------------------")
}

打印输出:

用例1.8、List的拉链操作

代码实现:

package org.apache.scala.day03
/**
 * 描述: List的常用方法测试,用例8
 * 时间: 2021/7/18
 */
object Demo015_Tuple {

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

    // 声明一个Tuple
    val t = ("huangbo", 22, 55.55, true)

    // 声明一个Tuple
    val t1, (a, b, c, d) = ("huangbo", 22, 55.55, true)

    // 打印输出一个Tuple
    println(t1)
    println(a, b, c, d)

    // 访问Tuple对应位置上的元素
    val aa = t1._1
    println(aa, t1._2, t1._3)

    // 将元素是 二元组 的集合转换成Map
    var array = Array(("A", 1), ("B", 2))
    val map1 = array.toMap
    println(map1)

    // 可以将一个map转成一个 二元组 的数组
    val tuple1 = map1.toArray
    println(tuple1.toBuffer)

    // 如果只需要使用元组中的部分元素呢。
    val (aa1, _, bb1, _) = t1
    println(aa1, bb1)

    // List的拉链操作
    val alist = List("a", "b", "c")
    val blist = List(1, 2, 3)
    val result33: Map[String, Int] = alist.zip(blist).toMap
    println(result33)
  }
}

 打印输出:


 2、99乘法表

代码实现:

package org.apache.scala.day03

/**
 * 99乘法表
 */
object Demo021_99 {

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

    // 传统方式
    for (i <- 1 to 9) {
      for (j <- 1 to i) {
        printf("%d*%d=%2d\t", i, j, (i * j))
      }
      println()
    }

    println("-------------------------------------")

    // 新方式1
    for (i <- 1 to 9; j <- 1 to i) {
      printf("%d*%d=%2d\t", i, j, (i * j)); if (i == j) println()
    }

    // 新方式2
    for (i <- 1 to 9; j <- 1 to i) {
      print(s"$i*$j=${i * j}${if (i == j) "\n" else "\t"}")
    }
  }
}

打印输出:


3、Java版本的wordcount

代码实现:

package org.apache.java.dayo3;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 描述: Java版本的wordcount
 *
 * 准备数据:在E:\TestDemo下创建wcount.txt文本,该文本主要数据有:
 *
 * hadoop,workproject
 * flink,flume
 * spark,hive
 * chickhouse,kylie
 * hbase,spark,spark Streaming
 * window time
 *
 * 运行会在E:\TestDemo文件下生成result.txt文本,该文本里面会生成如下内容:
 * Streaming	1
 * hadoop,workproject	1
 * spark,hive	1
 * flink,flume	1
 * chickhouse,kylie	1
 * hbase,spark,spark	1
 * window	1
 * time	1
 */
public class Demo022_JavaWordCount {
    public static void main(String[] args) throws Exception {

        FileInputStream fileInputStream = new FileInputStream(new File("E:\\TestDemo\\wcount.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream));

        Map<String, Integer> wordContext = new HashMap<String, Integer>();

        String line = null;
        while ((line = br.readLine()) != null) {

            String[] words = line.split(" ");
            for (String word : words) {
                if (wordContext.containsKey(word)) {
                    wordContext.put(word, wordContext.get(word) + 1);
                } else {
                    wordContext.put(word, 1);
                }
            }
        }

        File file = new File("E:\\TestDemo\\result.txt");
        if (!file.exists()) {
            file.delete();
        }
        file.createNewFile();
        PrintWriter printWriter = new PrintWriter(file);

        // 展示结果
        Set<String> keys = wordContext.keySet();
        for (String key : keys) {
            System.out.println(key + "\t" + wordContext.get(key));
            printWriter.println(key + "\t" + wordContext.get(key));
        }

        br.close();
        printWriter.close();
    }
}

 打印输出:统计出现次数

4、scala版本的wordcount

代码实现:

package org.apache.scala.day03

/**
 * 描述: wordcount
 */
object Demo022_WordCount {
  def main(args: Array[String]): Unit = {

    val array = Array("hello huangbo", "hello xuzheng", "hello wangbaoqiang")

    /**
     * 第一种方式
     */
    val result: List[(String, Int)] = array.flatMap(_.split(" "))
      .map((_, 1))
      .groupBy(t => t._1)
      .map(t => (t._1, t._2.length))
      .toList
      .sortBy(t => t._2)
      .reverse
    for (t <- result) {
      println(t)
    }
    println("------------------------------1------------------------------------")


    /**
     * 第二种方式
     */
    val result2: Map[String, Int] = array.flatMap(_.split(" "))
      .map(x => (x, 1))
      .groupBy(x => x._1)
      .mapValues(x => x.length)
    for ((k, v) <- result2) {
      println(k, v)
    }
    println("------------------------------2------------------------------------")


    /**
     * 第三种方式
     */
    val result3: Map[String, Int] = array.flatMap(_.split(" "))
      .map(x => (x, 1))
      .groupBy(x => x._1)
      .mapValues(x => x.foldLeft(0)((x, y) => x + y._2))
    for ((k, v) <- result3) {
      println(k, v)
    }
  }
}

打印输出:


5、Scala的插入排序

代码实现:

package org.apache.scala.day03
import scala.util.control.Breaks
/**
 * 描述: Scala的插入排序
 */
object Demo023_InsertSort {
  def main(args: Array[String]): Unit = {

    val array = Array(4, 12, 6, 3, 8, 9, 5)
    val ab = array.toBuffer

    // 创建Breaks对象
    val forLoop = new Breaks

    for (i <- 1 until ab.length) {
      val value_i = ab(i)

      // 把需要可能break的代码放在 breakable 中执行
      forLoop.breakable {
        for (j <- 0 to i - 1) {

          val value_j = ab(j)
          if (value_j > value_i) {
            ab.remove(i, 1)
            ab.insert(j, value_i)

            // 使用break进行跳出
            forLoop.break()
          }
        }
      }
    }
    println(ab)
  }

}

打印输出:


6、保留所有正数

代码实现:

package org.apache.scala.day03

/**
 * 描述: 练习
 * 保留所有正数
 * 移除list中的第一个负数
 * 移除list中出第一个负数外的所有负数
 */
object Demo024_Exercise {
  def main(args: Array[String]): Unit = {

    val list1 = List(1, 2, 3, -1, -2, -3)
    list1.foldLeft((0, 0))((x, y) => (x._1 + y, x._2 + 1))

    // 1、保留所有的正数
    list1.filter(x => if (x > 0) true else false).foreach(println)

    // 2、移除list1中的第一个负数得到List(1,2,3,-2,-3)
    var flag = 0
    list1.filter(x => {
      if (x < 0) flag += 1
      (x > 0 || flag >= 2)
    }).foreach(x => println(x))

    // 3、移除除第一个负数外的所有负数List(1,2,3,-1)
    var abc = 0
    list1.filter(x => {
      if (x < 0) abc += 1
      (x > 0 || abc <= 1)
    }).foreach(x => println(x))

    var array1 = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val result1 = array1.foldLeft(10)((x: Int, y: Int) => x + y)
    println(result1)

    val result2 = array1.foldRight(10)((x: Int, y: Int) => x + y)
    println(result2)

    val tuple = array1.foldLeft((0, 0))((x, y) => (x._1 + y, x._2 + 1))
    println(tuple._1.toDouble / tuple._2)
  }
}

 打印输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值