任务概述
- 1、定义一个方法 listTest(ArrayList list, String name),要求返回
name 在 list 里面第一次出现的索引,如果 name 没出现过返回-1。 - 2、已知数组存放一批 QQ 号码,长度 5-11 位,
String[] strs = {“10001”,“10086”,“12347806666”,“45612378901”,“10001”,“12347806666”}。
将该数组里面的所有 qq 号都存放在 LinkedList 中,将 list 中重复元素删
除,将 list 中所有元素分别用迭代器和增强 for 循环打印出来。 - 3、分别用Comparable和Comparator两个接口对下列四位同学的成绩做降
序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。
姓名(String) | 年龄(int) | 分数(double) |
---|---|---|
贾宝玉 | 14 | 88.5 |
林黛玉 | 13 | 90.5 |
史湘云 | 13 | 85 |
薛宝钗 | 15 | 91 |
任务一
题目大意
定义一个方法 listTest(ArrayList list, String name),要求返回
name 在 list 里面第一次出现的索引,如果 name 没出现过返回-1
实现思路
由题目可知,这是一个小型的姓名查询系统
编写Test类,定义ArrayList来存放姓名,add姓名进行初始化
ArrayList<String> list = new ArrayList<>();//定义ArrayList,使用数组结构
//往list中添加name
list.add("张三");
list.add("张四");
list.add("张五");
list.add("张六");
list.add("张七");
进入查询,用while循环实现连续查询,while末尾添加判断是否结束查询来控制循环
while(true){
System.out.print("请输入要查找的姓名:");
Scanner input = new Scanner(System.in);
String s = input.nextLine();
int index = listTest(list,s);
if(index == -1){
System.out.println("未查询到" + s + "的信息");
}else{
System.out.println(s + "第一次出现的索引位置为:" + index);
}
System.out.println("是否继续查询?");
System.out.println("1.是");
System.out.println("2.否");
String xStr = input.nextLine();
int x = Integer.valueOf(xStr);
if(x == 2){
System.out.println("欢迎下次查询!");
break;
}
}
调用listTest方法,通过对list的遍历来进行查询姓名是否存在,如果存在返回下表索引,不存在返回-1
public static int listTest(ArrayList<String> list, String name){
for(int i = 0;i < list.size();i++){
if (name.equals(list.get(i))){//如果list中有name,则返回下标索引i
return i;
}
}
return -1;
}
代码实现
完整代码如下
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();//定义ArrayList,使用数组结构
System.out.println("==========欢迎使用姓名查询系统========");
//往list中添加name
list.add("张三");
list.add("张四");
list.add("张五");
list.add("张六");
list.add("张七");
//进行连续查询
while(true){
System.out.print("请输入要查找的姓名:");
Scanner input = new Scanner(System.in);
String s = input.nextLine();
int index = listTest(list,s);
if(index == -1){
System.out.println("未查询到" + s + "的信息");
}else{
System.out.println(s + "第一次出现的索引位置为:" + index);
}
System.out.println("是否继续查询?");
System.out.println("1.是");
System.out.println("2.否");
String xStr = input.nextLine();
int x = Integer.valueOf(xStr);
if(x == 2){
System.out.println("欢迎下次查询!");
break;
}
}
}
public static int listTest(ArrayList<String> list, String name){
for(int i = 0;i < list.size();i++){
if (name.equals(list.get(i))){//如果list中有name,则返回下标索引i
return i;
}
}
return -1;
}
}
运行结果如图所示
任务二
题目大意
已知数组存放一批 QQ 号码,长度 5-11 位,String[] strs ={“10001”,“10086”,“12347806666”,“45612378901”,“10001”,“12347806666”}
将该数组里面的所有 qq 号都存放在 LinkedList 中,将 list 中重复元素删除,将 list 中所有元素分别用迭代器和增强 for 循环打印出来
实现思路
定义一个返回类型为LinkedList的方法将strs中的qq号不重复地添加进list中
public static LinkedList<String> getList(String[] s) {
LinkedList<String> list = new LinkedList<>();
for(int i = 0;i < s.length;i++){//遍历字符串,将不重复地QQ放入数组
if(list.contains(s[i])) {//如果已经有这个元素了
continue;
}else{//list中没有这个元素,添加元素
list.add(s[i]);
}
}
return list;
}
通过增强for循环遍历原始字符串数组中的数据
for (String s :strs){
System.out.println(s);
}
通过迭代器和增强for循环遍历list中的数据
System.out.println("===========迭代器遍历=============");
Iterator<String> iterator = list.iterator();//使用迭代器遍历
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("===========增强for循环遍历=============");
for(String s:list){
System.out.println(s);
}
代码实现
完整代码如下:
public class removeRepeatTest {
public static void main(String[] args) {
String[] strs = {"10001","10086","12347806666","45612378901","10001","12347806666"};
LinkedList<String> list = getList(strs);//通过getList,将数组里面的所有QQ不重复地都放在LinkedList中
System.out.println("原始数据");
for (String s :strs){
System.out.println(s);
}
System.out.println("\n删除重复元素后的数据");
System.out.println("===========迭代器遍历=============");
Iterator<String> iterator = list.iterator();//使用迭代器遍历
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("===========增强for循环遍历=============");
for(String s:list){
System.out.println(s);
}
}
public static LinkedList<String> getList(String[] s) {
LinkedList<String> list = new LinkedList<>();
for(int i = 0;i < s.length;i++){//遍历字符串,将不重复地QQ放入数组
if(list.contains(s[i])) {//如果已经有这个元素了
continue;
}else{//list中没有这个元素,添加元素
list.add(s[i]);
}
}
return list;
}
}
运行结果如图所示
任务三
题目大意
分别用Comparable和Comparator两个接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序
姓名(String) | 年龄(int) | 分数(double) |
---|---|---|
贾宝玉 | 14 | 88.5 |
林黛玉 | 13 | 90.5 |
史湘云 | 13 | 85 |
薛宝钗 | 15 | 91 |
实现思路
首先定义一个Student类来存放数据
public class Student implements Comparable<Student> {
String name;
int age;
double score;
public Student(String name, int age, double score) {
this.name = name;
this.age = age;
this.score = score;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
实现Comparable接口
public int compareTo(Student o) {
if(this.score - o.score > 0){
return -1;
}else if(this.score - o.score < 0){
return 1;
}else{
return this.age - o.age;
}
}
定义ComparatorDemo实现Comparator接口
public class ComparatorDemo implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
if(o1.score - o2.score > 0){
return -1;
}else if(o1.score - o2.score < 0){
return 1;
}else{
return o1.age - o2.age;
}
}
}
Test类中新建对象并定义ArrayList来储存数据并打印
Student p1 = new Student("贾宝玉",14,88.5);//数据初始化
Student p2 = new Student("林黛玉",13,90.5);
Student p3 = new Student("史湘云",13,85);
Student p4 = new Student("薛宝钗",15,91);
ArrayList<Student> p = new ArrayList<>();//将数据放入ArrayList中
p.add(p1);
p.add(p2);
p.add(p3);
p.add(p4);
System.out.println("原始数据:");//先打印查看原始数据
for(Student s:p){
System.out.println(s.toString());
}
使用Comparable接口实现排序
Collections.sort(p);
for(Student s:p){
System.out.println(s.toString());
}
使用Comparator接口实现排序
Collections.sort(p,new ComparatorDemo());
for(Student s:p){
System.out.println(s.toString());
}
关于Comparable和Comparator接口的比较和运用可查看文章:
Java中Comparable和Comparator接口
代码实现
完整代码如下:
Student类
public class Student implements Comparable<Student> {
String name;
int age;
double score;
public Student(String name, int age, double score) {
this.name = name;
this.age = age;
this.score = score;
}
public Student() {
}
public int compareTo(Student o) {
if(this.score - o.score > 0){
return -1;
}else if(this.score - o.score < 0){
return 1;
}else{
return this.age - o.age;
}
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}
ComparatorDemo类
public class ComparatorDemo implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
if(o1.score - o2.score > 0){
return -1;
}else if(o1.score - o2.score < 0){
return 1;
}else{
return o1.age - o2.age;
}
}
}
Test类
package com.company.task.t0103.t02.t001.sort_t03;
import java.util.ArrayList;
import java.util.Collections;
public class CompareTest {
public static void main(String[] args) {
Student p1 = new Student("贾宝玉",14,88.5);//数据初始化
Student p2 = new Student("林黛玉",13,90.5);
Student p3 = new Student("史湘云",13,85);
Student p4 = new Student("薛宝钗",15,91);
ArrayList<Student> p = new ArrayList<>();//将数据放入ArrayList中
p.add(p1);
p.add(p2);
p.add(p3);
p.add(p4);
System.out.println("原始数据:");//先打印查看原始数据
for(Student s:p){
System.out.println(s.toString());
}
System.out.println("当前数据:");//打印查看当前数据
System.out.println("========comparable========");
Collections.sort(p);
for(Student s:p){
System.out.println(s.toString());
}
System.out.println("========comparator========");
Collections.sort(p,new ComparatorDemo());
for(Student s:p){
System.out.println(s.toString());
}
}
}