7-1 找出10个整数中的最大值、最小值、偶数的个数、偶数的平均值。例如知道题来巩固知识点
1.首先要明确next()和nextLine()是有区别的:在控制台输入的时候要区分
对于next()方法,将空格看作是两个字符串的间隔,如果发现空格则读取空格前用户的输入作为String返回;
对于nextLine()方法,它将空格当作字符串处理,当发现用户按下回车则读取回车前所有的数据(包括空格等等)并作为String类型一并返回;
2.为什么一般都使用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?何况里面还有ArrayList()动态数组的特殊方法呢
原因就在于List有多个实现类,如 LinkedList或者Vector等等,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类呢?这时候你只需要改动一行就行,:List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。假设你开始用 ArrayList alist = new ArrayList(),
这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。 ,如果没有特别需求的话,最好使用List list = new LinkedList() ,便于程序代码的重构. 这就是面向接口编程的好处
3.为什么List接口后面这样写的?
.这其实你也可以看作是多态的一种体现,这样你就只能调用List接口里面定义好的方法,而不能使用你自己在ArrayList扩展的方法。
List list = new ArrayList();
.这样你可以使用自己在ArrayList类上扩展的方法
ArrayList list = new ArrayList();
接口就是定义了一些行为,它要求你应该做什么。
假如你采用了面向接口编程方式,也就是第一种方式:List list = new ArrayList();
// 就能通过接口很大限度上规范开发人员的实现规则,因为你现在只能调用接口的方法。
4.为什么集合你可以直接打印,还需要使用迭代器了,还有for循环,或者foreach岂不是多此一举
原因是:集合打印出一个数组, 迭代器遍历for等等他们是当你需要对元素进行改写的时候用到的
5.为什么要用迭代器呀?
首先我们要明白有个叫Iterator返回一个迭代器就是集合的父类(哈哈,记不清了,你自己查查): 集合继承了迭代器接口,所以你在遍历的时候其实还是在使用迭代器可以这么说,这个可能就是 Java 接口的设计思想:“不需要知道它有什么,知道它能干什么就行了。”,
6.迭代器的使用
import java.util.Iterator;
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next()+" ");
}
7.别忘了ArrayList实现类也其实是一个动态数组
8.在集合排序的时候,有个升序默认的,降序的话你需要重写一个方法
import java.util.Collections;
Collections.sort(list);
9.集合在进行集合元素求和的时候,以及求平均数的方法;
public static void choose(ArrayList<Integer> list) {
int sum = 0;
ArrayList<Integer> chooseList = new ArrayList<>();
for(int i=0; i<list.size(); i++) {
if(list.get(i) %2 == 0) {//别忘了这是动态数组
chooseList.add(list.get(i));
//sum += chooseList.get(i);
}
}//System.out.println (chooseList);
System.out.println("偶数的个数是"+chooseList.size());
qiuhe(chooseList);
//System.out.println("偶数的平均值是"+ sum);
}
public static void qiuhe(ArrayList<Integer> list) {
Double sum = 0.0;
for(Integer a : list) {
sum += a;
}
System.out.printf("偶数的平均值是:%.1f", sum/list.size());
}
这里你可能会想那个包装类怎么不是不可以进行加减乘除运算吗?
但是你别忘了包装类和基本数据类型之间可是有自动装箱和自动拆箱
注意在定义double时 double sum = 0.0; 不是0
这道题的整体代码如下
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Scanner;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String str = input.nextLine();
String[] strArray = str.split(" ");
ArrayList<Integer> list = new ArrayList<>();
for(int i=0; i<strArray.length; i++) {
list.add(Integer.parseInt(strArray[i]));
}
Collections.sort(list);
System.out.println("最大值是"+list.get(9));
System.out.println("最小值是"+list.get(0));
choose(list);
}
public static void choose(ArrayList<Integer> list) {
int sum = 0;
ArrayList<Integer> chooseList = new ArrayList<>();
for(int i=0; i<list.size(); i++) {
if(list.get(i) %2 == 0) {
chooseList.add(list.get(i));
}
}
System.out.println("偶数的个数是"+chooseList.size());
qiuhe(chooseList);
}
public static void qiuhe(ArrayList<Integer> list) {
double sum = 0.0;
for(Integer a : list) {
sum += a;
}
if(list.size()!=0)
System.out.printf("偶数的平均值是%.1f", sum/list.size());
else{
System.out.printf("偶数的平均值是%.1f", 0.0);
}
}
}