Day-02

Scanner对象

next()----判断语句if

next()不能得到带有空格的字符串,以空格为结束符

 import java.util.Scanner;
 ​
 public class Demo1 {
     public static void main(String[] args) {
         //创建一个扫描器对象,用于接收键盘数据
         Scanner scanner=new Scanner(System.in);
         System.out.println("使用next方法接收:");
         //判断用户有没有输入字符串
         if (scanner.hasNext()){
             //使用next方式接收
             String str=scanner.next();
             System.out.println("输出的内容为:"+str);}
        //关闭扫描器
 ​
         scanner.close();
     }
 }
 ​

输出

使用next方法接收:

Hello world 输出的内容为:Hello

nextLine()

nextLine()以Enter为结束符,也就是说,nextLine()方法返回的是输入回车之前的所有字符

 import java.util.Scanner;
 ​
 public class Demo2 {
     public static void main(String[] args) {
         //创建一个扫描器对象,用于键盘接收数据
         Scanner scanner=new Scanner(System.in);
         System.out.println("使用nextLine方式接收:");
         //判断是否有字符串输入
         if (scanner.hasNext()){
             //从标准输入(通常是键盘)读取用户输入的一整行文本,并将其存储到一个名为 str的字符串变量中
             String str = scanner.nextLine();
             System.out.println("输出的内容:"+str);
         }
         scanner.close();
     }

输出

使用nextLine方式接收: Hello world 输出的内容:Hello world

补充

特性++m(前置自增)m++(后置自增)
操作顺序先让 m的值加1,然后使用新值进行后续运算先使用 m的原始值进行后续运算,然后再让 m的值加1
表达式返回值返回 自增之后 的新值返回 自增之前 的原始值
共同效果执行完成后,变量 m的值都增加了1执行完成后,变量 m的值都增加了1

循环语句while()

 import java.util.Scanner;
 ​
 public class Demo4
 {
     public static void main(String[] args) {
         //我们可以输入多个文字,并求其总和与平均数,每输入一个数字用回车来确认,通过输入非数字来结束输入并输出执行结果;
         Scanner scanner=new Scanner(System.in);
         //和
         double sum=0;
         int m=0;
         while (scanner.hasNextDouble()){
             double x=scanner.nextDouble();
             m=m+1;//m++
             sum=sum+x;
             System.out.println("你输入了第"+m+"个数据,当前和为sum="+sum);
         }
         //输出和,平均值
         System.out.println("个数的和为:"+sum);
         System.out.println("个数的平均值为:"+sum/m);
 ​
         //释放该 Scanner对象所占用的系统资源,特别是其关联的输入流(如键盘输入、文件等)
         scanner.close();
     }
 }
 ​

输出

10 你输入了第1个数据,当前和为sum=10.0 20 你输入了第2个数据,当前和为sum=30.0 55 你输入了第3个数据,当前和为sum=85.0 31 你输入了第4个数据,当前和为sum=116.0 a 个数的和为:116.0 个数的平均值为:29.0

顺序结构

它是任何一种算法都不能缺少的结构

 package Day02;
 ​
 public class ShunxuDemo {
     public static void main(String[] args) {
         System.out.println("你好1");
         System.out.println("你好2");
         System.out.println("你好3");
         System.out.println("你好4");
         System.out.println("你好5");
 ​
     }
 ​
 }
 ​

选择结构

if单选择结构

语法

if(布尔表达式){

//如果布尔表达式为true将执行的语句

}

 package Day02;
 ​
 import java.util.Scanner;
 ​
 public class IfDemo1 {
     public static void main(String[] args) {
         Scanner scanner=new Scanner(System.in);
         System.out.println("请输入内容:");
         String s = scanner.nextLine();
         //equals:判断字符串是否相等
         if (s.equals("Hello")){
             System.out.println(s);
         }
         System.out.println("End");
 ​
         scanner.close();
     }
 }
 ​

if双选择结构

语法

if(布尔表达式){

//如果布尔表达式为true

}else{

//如果布尔表达式为true

}

 package Day02;
 ​
 import java.util.Scanner;
 ​
 public class IfDemo2 {
     public static void main(String[] args) {
         //考试分数大于60为及格,小于60为不及格
         Scanner scanner=new Scanner(System.in);
         System.out.println("请输出成绩:");
         int grade = scanner.nextInt();
         if (grade>=60){
             System.out.println("成绩及格");
         }else{
             System.out.println("成绩不及格");
         }
                 scanner.close();
     }
 }

if多选择结构

语法

if(布尔表达式1){

//如果布尔表达式1为true执行代码

}else if(布尔表达式2){

//如果布尔表达式2为true执行代码

}else if(布尔表达式3){

//如果布尔表达式3为true执行代码

}else{

//如果以上布尔表达式都不为true执行代码

}

 package Day02;
 ​
 import java.util.Scanner;
 ​
 public class IfDemo3 {
     //考试分数大于60为及格,小于60为不及格
     public static void main(String[] args) {
         Scanner scanner=new Scanner(System.in);
         System.out.println("请输出成绩:");
         int grade = scanner.nextInt();
         /*
       if语句至多有1个else语句,else语句在所有的else If语句之后
       If语句可以有若干个elseIf语句,它们必须在else语句之前
       一旦其中一个elseIf语句为true,其他的else If以及else语句都将跳过执行。
         */
         if(grade==100){
             System.out.println("恭喜满分");
         }else if(grade<100&&grade>=90){
             System.out.println("A级");
         }else if(grade<90&&grade>=80){
             System.out.println("B级");
         }else if(grade<80&&grade>=70){
             System.out.println("C级");
         }else if(grade<70&&grade>=60){
             System.out.println("D级");
         }else if(grade<60&&grade>=0){
             System.out.println("不及格10");
         }
         else{
             System.out.println("成绩不合法");
         }
 ​
     }
 ​
 }

嵌套的If结构

语法

if(布尔表达式1){

//如果布尔表达式1为true执行代码

if(布尔表达式2){

//如果布尔表达式2为true执行代码

} }

switch多选择结构

 package Day02;
 ​
 import com.sun.xml.internal.ws.addressing.WsaActionUtil;
 ​
 public class SwitchDemo1 {
     public static void main(String[] args) {
         //case穿透  //Switch匹配一个具体的值
         char grade='C';
         switch (grade){
             case 'A':
                 System.out.println("优秀");
                 break;//可选
             case 'B':
                 System.out.println("良好");
                 break;//可选
             case 'C':
                 System.out.println("及格");
                 break;//可选
             case 'D':
                 System.out.println("再接再厉");
                 break;//可选
             case 'E':
                 System.out.println("挂科");
                 break;//可选
             default:
                 System.out.println("未知等级");
         }
     }
 }
 ​

循环结构

while循环

对于while语句而言,如果不满足条件,则不能进入循环

 package Day02;
 ​
 public class WhileDemo1 {
     public static void main(String[] args) {
         //计算1+2+3+。。。+100
         int sum=0;
         int i=0;
         while (i<=100){
             sum=sum+i;
             i++;
 ​
         }
         System.out.println("总和为:"+sum);
     }
 }
 ​

do...while循环

语法

do{

//代码语句

}while(布尔表达式)

 package Day02;
 ​
 public class DowhileDemo1 {
     public static void main(String[] args) {
         //计算1+2+3+。。。+100
         int sum=0;
         int i=0;
         do{
             sum=sum+i;
             i++;
         }while (i<=100);
         System.out.println("总和为"+sum);
     }
 }
 ​

While 和do...while的区别

  • while先判断后执行,dowhile是先执行后判断

  • Do...while总是保证循环体会被至少执行一次!

For循环

  • for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构

  • 最先执行和初始化步骤,可以声明一种类型,但可初始化一个或多个循环控制变量,但也可以是空语句

  • 检测布尔表达式的值,如果为true,循环体被执行,如果为false,循环终止,开始执行循环体后面的语句

  • 执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)

  • 再次检测布尔表达式,循环执行上面过程

语法

for(初始化;布尔表达式;更新){

//代码语句}

例题1,计算0到100之间的奇数和偶数之间的和

 package Day02;
 ​
 public class ForDemo2 {
     public static void main(String[] args) {
         //计算0到100之间的奇数和偶数之间的和
         int sum1=0;//用于计算奇数和
         int sum2=0;//用于计算偶数和
         for (int i=0;i<100;i++){
        if (i%2!=0){//为奇数
            sum1+=i;
        }else{//为偶数
            sum2+=i;
        }
 ​
     } System.out.println("奇数和:"+sum1);
 ​
         System.out.println("偶数和:"+sum2);
     }
 }
 ​

练习2 ,用while或For循环输出1-1000之间能被5整除的数,并且每行输出3个

 package Day02;
 ​
 public class ForDemo3 {
     public static void main(String[] args) {
        // 用while或For循环输出1-1000之间能被5整除的数,并且每行输出3个
         for (int i=1;i<=1000;i++){
             if (i%5==0){
                 System.out.print(i+"\t");//\t为转义字符,在输出文本时,将光标移动到下一个“制表位”,产生类似按Tab键的空格效果,主要用于文本对齐
             }
             //当 i 是15的倍数(即余数为0)时,表示已经输出了3个元素,
             // 此时执行 System.out.println()进行换行。
             if (i%(5*3)==0){//每行
                 System.out.println();
                 //System.out.print("\n");
             }
         }
         //println 输出完会换行
         //print  输出玩不会换行
         System.out.println("用while循环:");//if嵌套语句
         int a=1;
         while (a<=1000){
             if (a%5==0){
                 System.out.print(a+"\t");
 ​
             if (a%(5*3)==0){//每行
                 System.out.println();
         }
     }a++;
         }
 }}
 ​

练习3,九九乘法表

 package Day02;
 /*
 1×1=1
 1×2=2 2×2=4
 1×3=3 2×3=6 3×3=9
 1×4=4 2×4=8 3×4=12 4×4=16
 1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
 1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
 1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
 1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
 1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81 */
 public class ForDemo4 {
     public static void main(String[] args) {
    //1.先打印第一列
    //2.固定的1再用一个循环包起来
    //3.去掉重复项i<=j
    //4.调整样式
    for (int j=1;j<=9;j++){
     for (int i=1;i<=j;i++) {
         System.out.print(j+"*"+i+"="+(j*i)+"\t");
     }
        System.out.println();
     }
     }
 }

增强for循环

 package Day02;
 ​
 public class ForDemo5 {
     public static void main(String[] args) {
         int[] numbers={10,20,30,40,50};//定义一个数组;
 ​
         for (int i=0;i<5;i++) {
             System.out.println(numbers[i]);
         }
         System.out.println("=========");
         //遍历数组的元素
         for (int x:numbers){
             System.out.println(x);
         }
     }
     }

break和continue

  • break在任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)

  • continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

<think>首先,用户要求使用中文回答问题。问题是一个SQL查询,我需要解释它。 查询是: ```sql insert into table ads_continuity_wk_count select '2019-02-20', concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-1)), count(*) from ( select mid_id from dws_uv_detail_wk where wk_dt>=concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-7*2-1)) and wk_dt<=concat(date_add(next_day('2019-02-20','MO'),-7),'_',date_add(next_day('2019-02-20','MO'),-1)) group by mid_id having count(*)=3 )t1 ``` 我需要解释这个查询的作用。查询似乎是在计算连续活跃的用户数,具体是每周连续活跃三周的用户。 关键点: - `ads_continuity_wk_count` 是目标表,存储连续活跃周数。 - 查询插入三个值:一个日期字符串、一个表示周范围的字符串、和计数。 - 日期:'2019-02-20',可能是指定日期。 - 周范围:`concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-1))` - `next_day('2019-02-20','MO')` 返回指定日期后的下一个星期一。假设'MO'是Monday- 在Hive SQL中,`next_day` 函数返回下一个指定工作日的日期。 - 所以,`next_day('2019-02-20','MO')` 返回2019-02-20之后的下一个星期一。 - 2019-02-20是星期三,所以下一个星期一是2019-02-25。 - 然后,`date_add(next_day('2019-02-20','MO'),-7*3)` 减去21天(3周),所以2019-02-25 - 21天 = 2019-02-04。 - `date_add(next_day('2019-02-20','MO'),-1)` 减去1天,所以2019-02-25 - 1 = 2019-02-24。 - 所以,concat 结果是 '2019-02-04_2019-02-24',表示一个周范围(从周一到周日?)。 - 计数:从子查询中计数。 子查询: ```sql select mid_id from dws_uv_detail_wk where wk_dt>=concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-7*2-1)) and wk_dt<=concat(date_add(next_day('2019-02-20','MO'),-7),'_',date_add(next_day('2019-02-20','MO'),-1)) group by mid_id having count(*)=3 ``` - `wk_dt` 是周日期字段,可能存储周范围字符串,如 'start_date_end_date'。 - 条件: - `wk_dt >= concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-7*2-1))` - 计算:`next_day('2019-02-20','MO')` = 2019-02-25 - `date_add(2019-02-25, -21)` = 2019-02-04 - `date_add(2019-02-25, -14 -1)` = -15 days? -7*2 = -14, -1 = -15, so 2019-02-25 -15 = 2019-02-10 - 所以,concat 是 '2019-02-04_2019-02-10' - `wk_dt <= concat(date_add(next_day('2019-02-20','MO'),-7),'_',date_add(next_day('2019-02-20','MO'),-1))` - `date_add(2019-02-25, -7)` = 2019-02-18 - `date_add(2019-02-25, -1)` = 2019-02-24 - 所以,concat 是 '2019-02-18_2019-02-24' - 因此,wk_dt 范围是 >= '2019-02-04_2019-02-10' 和 <= '2019-02-18_2019-02-24' - 这覆盖了三周:2019-02-04 到 2019-02-10(周1)、2019-02-11 到 2019-02-17(周2)、2019-02-18 到 2019-02-24(周3)。 - group by mid_id,having count(*)=3,意思是用户在这三周中每周都有记录,即连续三周活跃。 然后,外部查询计数这样的用户数。 插入到 ads_continuity_wk_count 的值是: - '2019-02-20':指定日期 - '2019-02-04_2019-02-24':三周范围 - count(*):满足条件的用户数 现在,我需要用中文解释这个查询。 解释后,我必须提出3-5个相关问题。问题必须以 "§§相关问题§§" 开头,然后列出1. 2. 3. 等。 相关问题应该基于用户的问题和我的回答。用户的问题是提供SQL查询,我需要解释它,所以相关问题可以涉及查询的细节、优化、或相关概念。 可能的疑问: 1. 为什么使用 next_day 函数? 2. wk_dt 字段的格式是什么? 3. 如何确保连续周? 4. 这个查询的性能如何? 5. 是否可以扩展到更多周? 确保输出格式: - 先回答问题。 - 然后,一行 "§§相关问题§§" - 然后1. 2. 3. 等,没有换行分散。 回答结构: 1. 简要描述查询目的。 2. 解释关键部分:日期计算、子查询逻辑。 3. 总结查询作用。 用中文。</think>### 解释 SQL 查询 该 SQL 查询用于计算在指定日期(2019-02-20)前连续三周活跃的用户数量,并将结果插入到表 `ads_continuity_wk_count` 中。以下是逐部分解析: 1. **目标表与插入结构**: - `insert into table ads_continuity_wk_count`:将结果插入到目标表,该表可能用于存储用户连续活跃周统计数据。 - 插入的三个字段: - `'2019-02-20'`:固定日期,表示计算基准日。 - `concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-1))`:计算一个周范围字符串。 - `next_day('2019-02-20','MO')` 获取 2019-02-20 后的下一个星期一(2019-02-20 是星期三,下一个星期一为 2019-02-25)。 - `date_add(2019-02-25, -7*3)` 减去 21 天(3 周),得到 2019-02-04。 - `date_add(2019-02-25, -1)` 减去 1 天,得到 2019-02-24。 - 最终拼接为 `'2019-02-04_2019-02-24'`,表示从 2019-02-04 到 2019-02-24 的三周范围。 - `count(*)`:统计满足条件的用户数。 2. **子查询逻辑**: - 从 `dws_uv_detail_wk` 表(可能存储用户周粒度活跃明细)筛选数据。 - `where wk_dt >= ... and wk_dt <= ...`:限定周范围。 - `wk_dt >= concat(date_add(next_day('2019-02-20','MO'),-7*3),'_',date_add(next_day('2019-02-20','MO'),-7*2-1))`: - `date_add(2019-02-25, -7*3)` 为 2019-02-04。 - `date_add(2019-02-25, -14 -1)` 减去 15 天(-7*2 -1 = -15),得到 2019-02-10。 - 拼接为 `'2019-02-04_2019-02-10'`(第一周)。 - `wk_dt <= concat(date_add(next_day('2019-02-20','MO'),-7),'_',date_add(next_day('2019-02-20','MO'),-1))`: - `date_add(2019-02-25, -7)` 为 2019-02-18。 - `date_add(2019-02-25, -1)` 为 2019-02-24。 - 拼接为 `'2019-02-18_2019-02-24'`(第三周)。 - 范围覆盖三周:第一周(2019-02-04 至 2019-02-10)、第二周(2019-02-11 至 2019-02-17)、第三周(2019-02-18 至 2019-02-24)。 - `group by mid_id having count(*)=3`:按用户 ID 分组,只保留在这三周中每周都有记录的活跃用户(即连续三周活跃)。 3. **整体作用**: - 该查询统计在 2019-02-20 基准日前连续三周活跃的用户数量。 - 结果插入 `ads_continuity_wk_count`,格式为:基准日、周范围字符串、用户数。 - 示例:如果子查询有 100 个用户满足条件,则插入 `('2019-02-20', '2019-02-04_2019-02-24', 100)`。 **潜在问题**:查询中 `t1` 后的 `、‘’` 可能是笔误(应为 `t1` 结束符),不影响逻辑,但需确保语法正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值