文章目录
- Java循环综合案例
- 案例一:逢 7 跳过
- 案例二:数组元素求和
- 案例三:判断两个数组是否相同
- 案例四:查找元素在数组中的索引
- 案例五:数组元素反转
- 案例六:评委打分
- 案例七:随机产生验证码
Java循环综合案例
案例一:逢 7 跳过
需求:
-
朋友聚会的时候可能会玩一个游戏:逢七过。
-
规则是:从任意一个数字开始报数,当你要报的数字包含7或者是7的倍数时都要说:过。
-
为了帮助大家更好的玩这个游戏,这里我们直接在控制台打印出1-100之间的满足逢七必过规则的数据。
分析:
- 通过循环获取到1~100之间的每一个数字
- 数值拆分,拆分出个位和十位
- 格局规则加入 if 判断
- 打印满足规则的数据
代码实现:
package cn.edu.hgu.test;
public class Test1 {
public static void main(String[] args) {
knockSeven();
}
/*
在控制台打印出1-100之间的满足逢七必过规则的数据
*/
public static void knockSeven() {
for (int i = 1; i <= 100; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
if (ge == 7 || shi == 7 || i % 7 == 0) {
System.out.println(i);
}
}
}
}
输出结果为:
案例二:数组元素求和
需求:
-
有这样的一个数组,元素是 {68,27,95,88,171,996,51,210}
-
求出该数组中满足要求的元素和
-
要求是:求和的元素个位和十位都不能是7,并且只能是偶数
代码实现:
package cn.edu.hgu.test;
public class Test2 {
public static void main(String[] args) {
int[] arr = {68, 27, 95, 88, 171, 996, 51, 210};
int sum = getEvenNumberSum(arr);
System.out.println("满足条件的元素和为:"+sum);
}
public static int getEvenNumberSum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
int ge = arr[i] % 10;
int shi = arr[i] / 10 % 10;
if (ge != 7 && shi != 7 && arr[i] % 2 == 0) {
sum += arr[i];
}
}
return sum;
}
}
输出结果为:
案例三:判断两个数组是否相同
需求:
-
定义一个方法,用于比较两个数组的内容是否相同
-
要求 : 长度, 内容, 顺序完全相同
分析:
==
- 基本数据类型:比较数据值
- 比较数据类型:比较地址值
代码实现:
package cn.edu.hgu.test;
public class Test3 {
public static void main(String[] args) {
int[] arr1 = {11, 22, 33};
int[] arr2 = {11, 22, 33};
boolean b = checkArrayContent(arr1, arr2);
System.out.println(b);
}
public static boolean checkArrayContent(int[] arr1, int[] arr2) {
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
}
输出结果为:
案例四:查找元素在数组中的索引
需求:
设计一个方法, 查找元素在数组中的索引位置
已知一个数组 arr = {19, 28, 37, 46, 50};
键盘录入一个数据,查找该数据在数组中的索引,并在控制台输出找到的索引值,如果没有查找到,则输出-1。
代码实现:
package cn.edu.hgu.test;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
int[] arr = {19, 28, 37, 46, 50};
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要查找的元素:");
int num = sc.nextInt();
int index = getIndex(num, arr);
System.out.println(index);
}
private static int getIndex(int num, int[] arr) {
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
index = i;
break;
}
}
return index;
}
}
输出结果为:
但是这样只能查找在元素第一次在数组中出现的位置,下面对代码进行改进:
package cn.edu.hgu.test;
public class Test4_2 {
public static void main(String[] args) {
int[] arr = {19, 28, 37, 28, 50, 66, 16, 28};
int[] results = getIndex(28, arr);
if (results.length == 0) {
System.out.println("您要查找的元素,在数组中不存在");
} else {
for (int i = 0; i < results.length; i++) {
System.out.println(results[i]);
}
}
}
private static int[] getIndex(int num, int[] arr) {
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
count++;
}
}
int[] results = new int[count];
int index = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
results[index] = i;
index++;
}
}
return results;
}
}
输出结果为:
思路积累:
问题:当一个方法运行结束后,有多个结果需要返回,怎么处理?
回答:可以将多个结果,存入一个数组容器,将数组返回。
案例五:数组元素反转
需求:
已知一个数组 arr = {11, 22, 33, 44, 55}; 用程序实现把数组中的元素值交换,
交换后的数组 arr = {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素。
需求: 实现两个变量的数据交换
int a = 10;
int b = 20;
方法一:定义中间变量:
代码:
package cn.edu.hgu.demo; public class SwapDemo1 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("交换前:"); System.out.println("a = " + a); System.out.println("b = " + b); int temp = a; a = b; b = temp; System.out.println("交换后:"); System.out.println("a = " + a); System.out.println("b = " + b); } }
输出结果为:
但如果面试题:实现两个变量的数据交换,不允许定义第三方变量
方法二:使用 ^(异或) 运算符
特点:
- 相同为 false,不同为 true
- 一个数字,被另一个数字异或两次,该数本身不变
代码
package cn.edu.hgu.demo; public class SwapDemo2 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("交换前:"); System.out.println("a = " + a); System.out.println("b = " + b); a = a ^ b;// a = 10 ^ 20; b = a ^ b;// b = 10 ^ 20 ^ 20 = 10; a = a ^ b;// a = 10 ^ 20 ^ 10; System.out.println("交换后:"); System.out.println("a = " + a); System.out.println("b = " + b); } }
案例实现:
package cn.edu.hgu.test;
public class Test5 {
public static void main(String[] args) {
int[] arr = {11, 22, 33, 44, 55};
reverseArray2(arr);
}
/*
方法二:双指针
*/
private static void reverseArray2(int[] arr) {
int start = 0;
int end = arr.length - 1;
for (; start < end; start++, end--) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
/**
* 方法一:循环遍历
*/
private static void reverseArray1(int[] arr) {
int len = arr.length;
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[len - 1 - i];
arr[len - 1 - i] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
案例六:评委打分
需求:
在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
选手的最后得分为:去掉一个最高分和一个最低分后 的4个评委平均值
代码如下:
package cn.edu.hgu.test;
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
int[] arr = initData();
double sum = getSum(arr);
int max = getMax(arr);
System.out.println("最大值为:" + max);
int min = getMin(arr);
System.out.println("最小值为:" + min);
//5.求平均分
double avg = (sum - max - min) / (arr.length - 2);
System.out.println("平均分为:" + avg);
}
/**
* 此方法用于求最小值
*/
private static int getMin(int[] arr) {
//4.求最小值
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (min > arr[i]) {
min = arr[i];
}
}
return min;
}
/**
* 此方法用于求最大值
*/
private static int getMax(int[] arr) {
//3.求最大值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
return max;
}
/**
* 此方法用于数组求和
*/
private static double getSum(int[] arr) {
//2.求和
double 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.键盘录入成绩
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;
}
}
输出结果为:
案例七:随机产生验证码
需求:
请从26个英文字母(大小写都包含),以及数字0-9中,随机产生一个5位的字符串验证码并打印在控制台
效果:uYq8I,3r4Zj
代码实现:
package cn.edu.hgu.test;
import java.util.Random;
public class Test7 {
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 index = r.nextInt(chs.length);
checkCode += chs[index];
}
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;
}
}
输出结果为: