大三Java暑期实训笔记(1)


如何将整数数组转化为一个整数

可能标题说的有点不清楚,举个例子:[1,2,3,4] 转化为整数 1234

我之前的思路就是写一个逆循环,每次都加加上序号对应的值和10的序号次方,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.company.playground;

public class IntArrayToInt {
public static void main(String[] args) {
int[] arr = {1,2,3,4};
int len = arr.length;
int result = 0;
for (int i = len - 1; i >= 0; i--) {
result += arr[i] * Math.pow(10, len-i-1);
}
// 1234
System.out.println(result);
}
}

但是老师上课的时候提供了另一种思路:写一个正序循环,每次加上序号对应的数组的值,然后在乘10,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.company.playground;

public class IntArrayToInt {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
int len = arr.length;
int result = 0;
for (int i = 0; i < len; i++) {
result *= 10;
result += arr[i];
}
// 1234
System.out.println(result);
}
}

数字的变化是这样的,括号中代表一个循环

( 0 –> 1 ) –> ( 10 –> 12 ) –> ( 120 –> 123 ) –> ( 1230 –> 1234 )

实话说当时我愣是盯着屏幕看了好久才研究出来,思路真是奇特


如何快速随机生成两个随机正整数,使第一个可以被第二个整除

说实话当初我的思路就是写一个循环,让其不停地生成两个随机数知道满足条件为止,但是老师说这样子的话会耗费一定的时间

老师给的思路是就使用那两个随机数,将第一个随机数变为合适的形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.company.playground;

import java.util.Random;

public class RandomIntDivision {
public static void main(String[] args) {
Random random = new Random();
// 设置随机数的范围
int min = 1;
int max = 999;

int optNum1 = random.nextInt(max - min + 1) + min;
int optNum2 = random.nextInt(max - min + 1) + min;

// 第一个数不能比第二个数小
if (optNum1 < optNum2) {
int tmp = optNum1;
optNum1 = optNum2;
optNum2 = tmp;
}

if (optNum1 % optNum2 != 0) {
// ----> !!!!!!! 这里
optNum1 = optNum1 - optNum1 % optNum2;
}
System.out.println(optNum1 + " " +optNum2);
}
}

将两个数做余运算,在用第一个数减去余数,这个方法的缺陷就是会产生大量的相等的两个数


处理输入流的底层方法

不论是 Scaner 或者是 InputStreamReader,都是对输入流的高层封装,今天老师带我们体验了一个最底层处理输入流的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.company.playground;

import java.io.InputStream;

public class BasicInputStream {
public static void main(String[] args) {
try {
InputStream inputStream;
while (true) {
inputStream = System.in;
int charCode;
charCode = inputStream.read();
System.out.println(charCode);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

这是一个死循环,你先想控制台中输入 ‘123’,然后控制台会打印出 49 50 51 10(*nix环境),如果是在Windows上做实验则为 49 50 51 13 10,前三个是’1’, ‘2’, ‘3’对应对ascii,而’13’对应的是回车,’10’对应的是换行,最底层永远是以byte为单位处理数据的。


如何格式化输出浮点数

一般如果做浮点数除法,可能输出会变成这样:3.444444444444444444444,如果我们想输出变得漂亮一点,并不考虑四舍五入,使其格式化输出,可以用 DecimalFormat 做如下操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.company.playground;

import java.text.DecimalFormat;

public class DisplayDecimal {
public static void main(String[] args) {
double arg = 1.0/3.0;
System.out.println(arg); // 0.3333333333333

DecimalFormat df = new DecimalFormat("#.##");
String rate = df.format(arg);
System.out.println(rate); // 0.33
}
}

如何获取系统当前的时间

1
2
3
4
5
6
7
package com.company.playground;

public class GetCurrnetSystemTime {
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
}
}

very nice!