数据结构基础练习(Java)

任务概述

  • 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)
贾宝玉1488.5
林黛玉1390.5
史湘云1385
薛宝钗1591

任务一

题目大意

定义一个方法 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)
贾宝玉1488.5
林黛玉1390.5
史湘云1385
薛宝钗1591

实现思路

首先定义一个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());
        }
    }
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1.1 单项选择题 1. 数据结构是一门研究非数值计算的程序设计问题中,数据元素的① 、数据信息在计算机中的② 以及一组相关的运算等的课程。 ① A.操作对象   B.计算方法  C.逻辑结构  D.数据映象 ② A.存储结构 B.关系 C.运算 D.算法 2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R),其中D是① 的有限集合,R是D上的② 有限集合。 ① A.算法 B.数据元素 C.数据操作 D.数据对象 ② A.操作 B.映象 C.存储 D.关系 3. 在数据结构中,从逻辑上可以把数据结构分成 。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4. 算法分析的目的是① ,算法分析的两个主要方面是② 。 ① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系 C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性 ② A. 空间复杂性和时间复杂性 B. 正确性和简明性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性。 ① A. 计算方法 B. 排序方法 C. 解决问题的有限运算序列 D. 调度方法 ② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性 1.2 填空题(将正确的答案填在相应的空中) 1. 数据逻辑结构包括 、 、 和 四种类型,树形结构和图形结构合称为 。 2. 在线性结构中,第一个结点 前驱结点,其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点。 3. 在树形结构中,树根结点没有 结点,其余每个结点有且只有 个直接前驱结点,叶子结点没有 结点,其余每个结点的直接后续结点可以 。 4. 在图形结构中,每个结点的前驱结点数和后续结点数可以 。 5. 线性结构中元素之间存在 关系,树形结构中元素之间存在 关系,图形结构中元素之间存在 关系。 6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。 7. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0;j<n; j++) A[i][j]=0; 8. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0; j<i; j++) A[i][j]=0; 9. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 s=0; for (i=0;i<n;i++) for (j=0;j<n;j++) for (k=0;k<n;k++) s=s+B[i][j][k]; sum=s; 10. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 int i=0,s=0; while (s<n) { i++; s+=i; //s=s+i } 11. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 i=1; while (i<=n) i=i*2;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selcouther

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值