案例一: 逢 7 跳过
package com.itheima.test;
public class Test1 {
public static void main(String[] args) {
knockSeven();
}
/*
需求: 在控制台打印出 1~100 之间满足逢七过规则的数据
分析:
1. 通过循环获取到1~100之间的每一个数字
2. 数值拆分, 拆分出个位和十位
3. 根据规则加入if判断
if(ge == 7 || shi == 7 || i % 7 == 0)
4. 打印出满意规则的数据
*/
public static void knockSeven(){
// 1. 通过循环获取到1~100之间的每一个数字
for(int i = 1; i <= 100; i++){
// 2. 数值拆分, 拆分出个位和十位
int ge = i % 10;
int shi = i / 10 % 10;
// 3. 根据规则加入if判断
if(ge == 7 || shi == 7 || i % 7 == 0){
System.out.println("过");
}else{
// 4. 打印出满意规则的数据
System.out.println(i);
}
}
}
}
案例二: 数组元素求和
package com.itheima.test;
public class Test2 {
public static void main(String[] args) {
int[] arr = new int[]{68, 27, 95, 88, 171, 996, 51, 210};
int evenNumberSum = getEvenNumberSum(arr);
System.out.println(evenNumberSum);
}
private static int getEvenNumberSum(int[] arr) {
// 1. 定义求和变量
int sum = 0;
// 2. 遍历数组中的每一个元素
for (int i = 0; i < arr.length; i++) {
int ge = arr[i] % 10;
int shi = arr[i] / 10 % 10;
// 3. 判断
if (ge != 7 && shi != 7 && arr[i] % 2 == 0) {
sum += arr[i];
}
}
// 4. 返回结果
return sum;
}
/*
需求 :
有这样的一个数组, 元素是 {68,27,95,88,171,996,51,210}
求出该数组中满足要求的元素和
要求是: 求和的元素个位和十位都不能是7, 并且只能是偶数
*/
}
案例三: 判断两个元素是否相同
package com.itheima.test;
public class Test3 {
/*
== :
1. 基本数据类型 : 比较数据值
2. 引用数据类型 : 比较地址值
*/
public static void main(String[] args) {
int[] arr1 = {11, 22, 33};
int[] arr2 = {11, 22, 33, 55};
boolean result = checkArrayContent(arr1, arr2);
System.out.println(result);
}
/*
需求: 定义一个方法, 比较两个数组的内容是否相同
要求: 长度, 内容, 顺序完全相同
*/
public static boolean checkArrayContent(int[] arr1, int[] arr2) {
// 1. 检查两个数组的长度是否相同
if (arr1.length != arr2.length) {
return false;
}
// 2. 检查两个数组内容是否相同
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
// 3. 到达这一步说明两个数组长度, 内容, 顺序完全相同
return true;
}
}
案例四: 查看元素在数组中的索引
(1) 从数组中找索引
package com.itheima.test;
import java.util.Scanner;
public class Test4_1 {
public static void main(String[] args) {
int[] arr = {19, 28, 37, 46, 59};
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要查找的元素:");
int num = sc.nextInt();
int index = getIndex(num, arr);
System.out.println(index);
}
/*
需求:
设计一个方法, 查找元素在数组中的索引位置
已知一个数组 arr = {19, 28, 37, 46, 59}
键盘录入一个数据, 查找该数据在数组中的索引.
并在控制台输出找到的索引值
如果没有查找到, 则输出-1
*/
public static int getIndex(int num, int[]arr){
// 1. 假设要查找的元素, 在数组中是不存在的
int index = -1;
// 2. 遍历数组,获取内部的每一个元素
for (int i = 0; i < arr.length; i++) {
// 3. 比较
if(arr[i] == num){
// 4. 找到后, 让index变量记录正确的索引位置
index = i;
break;
}
}
return index;
}
}
(2) 考虑(1)重复元素问题做出修改
package com.itheima.test;
import java.util.Scanner;
public class Test4_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = {19, 28, 37, 46, 50, 19, 19};
// 0 1 2 3 4 5 6
System.out.println("请输入一个数组中的元素");
int num = sc.nextInt();
int[] result = getIndex(num, arr);
System.out.println("对应的索引为:");
for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + " ");
}
}
/*
需求: 设计一个方法, 查找元素在数组中的索引位置 (考虑重复元素问题)
注意: return只能返回一个结果
问题: 当一个方法运行结束后, 有多个结果需要返回, 怎么处理?
回答: 可以将多个结果, 存入一个数组容器, 将数组返回.
*/
public static int[] getIndex(int num, int[] arr) {
// 1. 统计要查找的元素, 在数组中出现的个数
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
count++;
}
}
// 2. 根据统计出来的个数, 创建数组容器
int[] result = new int[count];
int index = 0;
// 3. 查找元素在数组中的索引, 将找到的索引, 存入数组容器
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
result[index] = i;
index++;
}
}
return result;
}
}
案例五: 数组元素反转
-
演示1:
package com.itheima.Demo;
public class SwapDemo1 {
/*
思路: 今后只要涉及到数据交换, 联想到第三方的变量
int a = 10;
int b = 20;
int c = a;
a = b;
b = c;
System.out.println("a=" + a); // 20
System.out.println("b=" + b); // 10
面试题: 实现两个变量的数据交换, 不允许定义第三方变量
*/
/*
^ 异或 :
特点:
1. 相同为false, 不同为true
2. 一个数字, 被另外一个数字异或两次, 该数本身不变
异或操作数值的运算过程 :
1. 将需要运算的数据, 转换为二进制数据
0000 1010 10
0000 0101 5
2. 将二进制数据的0当做为false, 1当做为true, 运算
0000 1010
^ 0000 0101
--------------------
0000 1111
3. 将运算后的二进制数据, 转换为十进制
*/
public static void main(String[] args) {
int a = 10;
int b = 20;
a = a ^ b; // a = 10 ^ 20
b = a ^ b; // b = 10 ^ 20 ^ 20 b = 10
a = a ^ b; // a = 10 ^ 20 ^ 10 a = 20
System.out.println("a=" + a); // 20
System.out.println("b=" + b); // 10
}
}
-
演示2:
package com.itheima.Demo;
public class SwapDemo2 {
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
// 数组中的第一个元素, 和最后一个元素进行交换
// 1. 确定后, 谁和谁交换 arr[0] arr[4]
// 2. 定义第三方变量, 倒手
int temp = arr[0];
arr[0] = arr[4];
arr[4] = temp;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
-
测试
package com.itheima.test;
public class Test5 {
/*
已知一个数组 arr = {11, 22, 33, 44, 55}; 用程序实现把数组中的元素值交换,
交换后的数组 arr = {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素.
1. 确定好谁跟谁换
第一个和倒数第一个 : arr[0] arr[arr.length-1-0]
第二个和倒数第二个 : arr[1] arr[arr.length-1-1]
第三个和倒数第三个 : arr[2] arr[arr.length-1-2]
...
arr[i] arr[arr.length-1-i]
2. 定义三方变量, 套入公式
*/
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
// reverseArray1(arr);
reverseArray2(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void reverseArray2(int[] arr) {
for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
private static void reverseArray1(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
}
}
案例六: 评委打分
package com.itheima.test;
import java.util.Scanner;
public class Test6 {
/*
需求:
在编程竞赛中, 有6个评委为参赛的选手打分, 分数为0-100的整数分.
选手的最后得分为: 去掉一个最高分和一个最低分后的四个评委平均值
1. 基本实现 (不考虑分数校验)
2. 校验键盘录入的分数是否是0~100之间
3. 抽取方法
*/
public static void main(String[] args) {
int[] arr = initData();
int sum = getSum(arr);
int max = getMax(arr);
int min = getMin(arr);
printAvg(arr, sum, max, min);
}
/**
* 数组中求平均值并打印*/
private static void printAvg(int[] arr, int sum, int max, int min) {
// 5. 求平均分 (总和 - 最大值 - 最小值) / 4
double avg = (sum - max - min) * 1.0 / (arr.length - 2);
System.out.println("选手最后的得分为:" + avg);
}
/**
* 数组中找最小值*/
private static int getMin(int[] arr) {
// 4. 求最小值
int min = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
/**
* 数组中找最大值*/
private static int getMax(int[] arr) {
// 3. 求最大值
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
/**
*数组求和 */
private static int getSum(int[] arr) {
// 2. 求和
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
/**
* 此方法用于键盘录入6个评委的分数
* */
private static int[] initData() {
int[] arr = new int[6];
// 1. 键盘录入6个评委的打分
Scanner sc = new Scanner(System.in);
System.out.println("请输入6个评委的评分:");
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "位评委的打分");
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
arr[i] = score;
} else {
System.out.println("您的分数输入有误, 请检查该分数是否处于0~100之间!");
i--;
}
}
return arr;
}
}
案例七: 随机产生验证码
package com.itheima.test;
import java.util.Random;
import java.util.Scanner;
public class Test7 {
/*
需求: 请从26个英文字母 (大小写都包含) , 以及数字0-9中, 随机产生一个5位的字符串验证码并打印在控制台
效果: uYq8I, 3r4Zj
注意事项: 打印字符类型数组名, 不会看到地址值, 而是元素的内容
*/
public static void main(String[] args) {
char[] chs = getContents();
String checkCode = getCheckCode(chs);
System.out.println("产生的验证码为:" + checkCode);
}
private static String getCheckCode(char[] chs) {
Random r = new Random();
String checkCode = "";
for (int i = 1; i<=5; i++){
int randomIndex = r.nextInt(chs.length);
checkCode += chs[randomIndex];
}
return checkCode;
}
private static char[] getContents() {
char[] chs = new char[26 + 26 + 10];
int index = 0;
for (char c = 'a'; c <= 'z'; c++){
chs[index] = c;
index++;
}
for (char c = 'A'; c <= 'Z'; c++){
chs[index] = c;
index++;
}
for (char c = '0'; c <= '9'; c++){
chs[index] = c;
index++;
}
return chs;
}
}