12.08Java
今天学习了Java基本集合接口
public static void main(String[] args) {int a[]= {3,4,1,8,7,9,10,2,5,6};int b[]= new int[10];System.arraycopy(a, 2, b, 7, 3);Arrays.sort(a);for (int i = 0; i < b.length; i++) {System.out.print(b[i]+" ");}System.out.println();for (int i = 0; i < a.length; i++) {System.out.print(a[i]+" ");}}
public static void main(String[] arg) {int a[]= {1,2,5,6,8,7,9,4,3,10};Arrays.sort(a);for (int i= 0 ;i<a.length;i++ ) {System.out.print(a[i]+" ");}int b=Arrays.binarySearch(a, 8);
// 返回查找元素的下标System.out.println(b);}
public static void main(String[] arg) {int a[]= {1,2,5,6,8,7,9,4,3,10};int b[]= {1,2,3};int c[]= {1,2,3};System.out.println(Arrays.equals(a, b));System.out.println(Arrays.equals(c, b));}
public static void main(String[] arg) {ArrayList<String> a =new ArrayList<String>();ArrayList<String> b =new ArrayList<String>();a.add("aaa");a.add("bbb");a.add("ccc");a.add("ddd");b.add("123");b.add("456");b.add("789");System.out.println(a);System.out.println(b);System.out.println("-----------------------------");a.remove(0);System.out.println(a);System.out.println(a.contains("aaa"));System.out.println(a.indexOf("ccc"));System.out.println("-----------------------------");a.addAll(b);System.out.println(a);a.removeAll(b);a.removeAll(a);System.out.println(a);}
public static void main(String[] arg) {ArrayList<String> a =new ArrayList<String>();a.add("aaa");a.add("bbb");a.add("ccc");a.add("ddd");
// 使用Iterator输出Iterator<String> iter = a.iterator();while(iter.hasNext()) {System.out.print(iter.next()+" ");}System.out.println();
// 使用forEach输出for (String s : a) {System.out.print(s+" ");}System.out.println();
// 使用toString输出System.out.println(a);// 使用for循环输出for (int i = 0; i < a.size(); i++) {System.out.print(a.get(i)+" ");}}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;public class HelloAdd {static ArrayList playerArray= new ArrayList();static List subListObj = new ArrayList();public static void main(String[] args) {add();display();System.out.println();search();System.out.println();extract();}static void add() {for (int i = 0; i < 5; i++) {playerArray.add(new Integer(i));}playerArray.add("Martina");playerArray.add("Serena");playerArray.add("Venus");playerArray.add("Serena");}static void display() {System.out.println("**************************************");System.out.println("从 ArrayList 中检索对象");System.out.println("**************************************");System.out.println();for (int i = 0; i < playerArray.size(); i++) System.out.print(" " + playerArray.get(i));}static void search() {System.out.println("***********************************************************");System.out.println("搜索一个对象并返回第一个和最后一个位置");System.out.println("************************************************************");System.out.println("字符串\"Serena\"第一次出现在位置是 "+ playerArray.indexOf("Serena"));System.out.println("字符串\"Serena\"最后一次出现在位置是 " + playerArray.lastIndexOf("Serena"));System.out.println(); }static void extract() {System.out.println("************************************************");System.out.println("提取一个子列表,然后输出新列表");System.out.println("*************************************************");System.out.println();subListObj = playerArray.subList(5, playerArray.size());System.out.println("索引 5 至"+playerArray.size()+"的新子列表为:"+ subListObj);System.out.println();}}
public static void main(String[] args) {
// 案例1:编写一个交错合并列表元素的程序。
// 例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。
// 若两个表元素个数不同,多余的附在合并表的尾ArrayList<String> a = new ArrayList<String>();ArrayList<String> b = new ArrayList<String>();ArrayList<String> c = new ArrayList<String>();a.add("a");a.add("B");a.add("C");a.add("d");a.add("e");b.add("1");b.add("2");b.add("3");int length = a.size()>b.size()?b.size():a.size();for(int i = 0;i<length;i++) {c.add(a.get(i));c.add(b.get(i));}if(a.size()>b.size()) {for(int i=b.size();i<a.size();i++) {c.add(a.get(i));}}else if(a.size()<b.size()) {for(int i=a.size();i<b.size();i++) {c.add(b.get(i));}}for (int i = 0; i < c.size(); i++) {System.out.print(c.get(i)+" ");}}
public static void main(String[] args) {
// 案例2:编写一个计算斐波那契数的程序。根据定义,斐波那契序列的前两位数字是0和1,
// 随后的每个数字是前两个数字的和。要求输出直到某项的值刚大于10000的前面所有项。
// 例如,前11位(刚大于50的前所有项)斐波那契数为:0,1,1,2,3,5,8,13,21,34,55。ArrayList<Integer> a = new ArrayList<>();a.add(0);a.add(1);int count2 =0;int count = 1;for(int i=0;;i++) {a.add(a.get(i)+a.get(i+1));count+=a.get(i+2);if(count>10000) {count2 = count-a.get(i+2);break;}}System.out.println(count2+" "+count);}//法二:
public static void main(String[] args) {// 创建一个存储斐波那契数列的ArrayListArrayList<Integer> fibonacciList = new ArrayList<>();fibonacciList.add(0);fibonacciList.add(1);// 计算斐波那契数列while (true) {int nextFibonacci = fibonacciList.get(fibonacciList.size() - 1) + fibonacciList.get(fibonacciList.size() - 2);if (nextFibonacci > 10000) {break; // 如果当前数值大于10000,则退出循环}fibonacciList.add(nextFibonacci);}// 输出结果System.out.println("斐波那契数列(直到大于10000的前面所有项)为:" + fibonacciList);}
public static void main(String[] args) {// 案例3:任意从键盘输入若干学生的成绩,当输入-1时,停止输入数据,计算这些数据的平均成绩,
// 并输出高于平均成绩的值。
// 分析:
// (1) 定义一个存放成绩的容器,每输入一个成绩,就将成绩添加到数组中,直到输入完成。
// (2)计算总成绩、平均成绩。
// (3)输出高于平均成绩的值。Scanner cin = new Scanner(System.in);double score = 0;score = cin.nextDouble();List<Double> arr = new ArrayList<>();while(score!=-1) {arr.add(score);score = cin.nextDouble();}for (Double integer : arr) {System.out.print(integer+" ");}System.out.println();double sum = 0;for(Double i:arr) {sum+=i;}double average = sum/arr.size();System.out.println("总成绩:"+sum+" "+"平均成绩:"+average);System.out.println("高于平均成绩的:");for(Double i : arr) {if(i>average) {System.out.println(i+" ");}}cin.close();}
public static void main(String[] args) {LinkedList mylist = new LinkedList();Student stu_1 = new Student("赵一", 9012, 80.0f), stu_2 = new Student("钱二", 9013, 90.0f),stu_3 = new Student("孙三", 9014, 78.0f), stu_4 = new Student("周四", 9015, 55.0f);mylist.add(stu_1);mylist.add(stu_2);mylist.add(stu_3);mylist.add(stu_4);Iterator<Student> iter = mylist.iterator();while(iter.hasNext()) {Student s = iter.next();s.printStudent();}}class Student {private String name;private int number;private float score;public Student(String name, int number, float score) {this.name = name;this.number = number;this.score = score;}public void printStudent(){System.out.println(name + " " +number + " " + score);}
}
总结:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
public static void main(String[] args) {
// HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,
// 而且采用散列的存储方法,所以没有顺序。
// 这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致。Set set1 = new HashSet();set1.add("a");set1.add("b");set1.add("a");set1.add("c");set1.add("d");Iterator iter = set1.iterator();while(iter.hasNext()) {System.out.print(iter.next()+" ");}}
//很巧妙的写法,把add写到if中去了。public static void main(String[] args) {HashSet set = new HashSet();Scanner sc=new Scanner(System.in);String ss=null;ss=sc.next();while(!ss.equals("end")) { if (!set.add(ss))System.out.println("重复的单词: "+ss);ss=sc.next();}System.out.print("形成的集合为: "+set); }//常规写法public static void main(String[] args) {HashSet set = new HashSet();Scanner sc=new Scanner(System.in);String ss=null;ss=sc.next();while(true) {ss = sc.next();if(ss.equals("end")) {break;}if(!set.contains(ss)) {set.add(ss);}else {System.out.println("重复元素为:"+ss);}}System.out.print("形成的集合为: "+set); }
还有TreeSet和Map没有写
public static void main(String[] args) {
// TreeSet类创建的对象称为树集。树集是由一些节点对象组成的数据结构
// 节点按着树形一层一层的排列。
// 树集是个有序集合,可以按照任何顺序将元素插入该集合,
// 该元素将被纳入它的相应的排序位置;
// 当迭代通过该集合时,各个值将自动按照排序后的顺序出现。Set s1 = new TreeSet();s1.add("bbb");s1.add("aaa");s1.add("ddd");s1.add("ccc");Iterator iter = s1.iterator();while(iter.hasNext()) {System.out.println(iter.next());}}
//输出:
//aaa
//bbb
//ccc
//ddd
一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接口和Comparator接口。首先类要实现接口,并且使用泛型规定要进行比较的对象所属的类,然后类实现了接口后,还需要实现接口定义的比较方法(compareTo方法或者compare方法),在这些方法中传入需要比较大小的另一个对象,通过选定的成员变量与之比较,如果大于则返回1,小于返回-1,相等返0。
1、Comparable和Comparator都是用来实现集合中元素的比较、排序的。
2、Comparable是在类内部定义的方法实现的排序,位于java.lang下。
3、Comparator是在类外部实现的排序,位于java.util下。
4、实现Comparable接口需要覆盖compareTo方法,实现Comparator接口需要覆盖compare方法。
package edu.sdau;import java.util.TreeSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;public class HelloAdd {public static void main(String[] args) {TreeSet<Person> ts = new TreeSet<>();ts.add(new Person("Tom", 24));ts.add(new Person("Jerry", 21));ts.add(new Person("Brown", 26));ts.add(new Person("Bob", 28));ts.add(new Person("Brown", 21));ts.add(new Person("Brown", 21));Iterator<Person> it = ts.iterator();while (it.hasNext()) {Person p = it.next();System.out.println(p.getName() + ":" + p.getAge());}}}class Person implements Comparable<Person> {private String name;private int age;Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int compareTo(Person p) {int temp1 = this.name.compareTo(p.name);return temp1 == 0 ? this.age - p.age : temp1; // 姓名相同时比较年龄}
}
package edu.sdau;import java.util.TreeSet;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;public class HelloAdd {public static void main(String[] args) {TreeSet<Student> set = new TreeSet<>(new StudentComparator()); set.add(new Student(80)); set.add(new Student(90)); set.add(new Student(60)); set.add(new Student(70)); System.out.println(set); }}class Student { int score; public Student(int score) { this.score = score; } public String toString() { return String.valueOf(score); }
} class StudentComparator implements Comparator<Student> { // 按学生成绩升序 public int compare(Student s1, Student s2) { return s1.score - s2.score; }
}
package edu.sdau;import java.util.TreeSet;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;public class HelloAdd {public static void main(String[] args) {TreeSet ts = new TreeSet(new ComparatorByLength());ts.add("aaaaa");ts.add("abaaa");ts.add("zz");ts.add("nbaq");ts.add("cba");ts.add("abc");Iterator it = ts.iterator();while (it.hasNext()) {System.out.println(it.next());}}
}class ComparatorByLength implements Comparator{public int compare(Object o1,Object o2) {String s1 = (String)o1;String s2 = (String)o2;int temp = s1.length()-s2.length();return temp == 0?s1.compareTo(s2) : temp;}
// 这是一个三元表达式,它首先判断temp是否等于 0,也就是判断两个字符串长度是否相等。
// 如果temp等于 0,说明长度相等,此时通过调用s1的compareTo方法(比较字母)进一步比较
// 字符串内容的字典序,按照字典序比较的结果返回相应的值(小于返回负整数,
// 等于返回 0,大于返回正整数);如果temp不等于 0,直接返回temp,
// 也就是基于长度比较得出的差值,这个差值本身就体现了两个字符串某种程度上的 “大小” 关系,
// 长度长的字符串在这种比较逻辑下被认为 “更大”。
}
还有Map没写