鱼C论坛

 找回密码
 立即注册
查看: 1238|回复: 11

[已解决]大佬们,求助一道数组问题,返回值应该是3,但它是-1

[复制链接]
发表于 2023-2-23 21:01:52 | 显示全部楼层 |阅读模式
10鱼币
/*定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同。学生的属性:学号,姓名,年龄。

        要求1:再次添加一一个学生对象,并在添加的时候进行学号的唯一-性判断。
        要求2:添加完毕之后,遍历所有学生信息。
        要求3:通过id删除学生信息
        如果存在,则删除,如果不存在,则提示删除失败。
        要求4:删除完毕之后,遍历所有学生信息。
        要求5:查询数组id为"heima002"的学生,如果存在,则将他的年龄+1岁
*/
public class Main {
    public static void main(String[] args) {
        //1.创建一个数组来存储学生对象
        Student[] arr = new Student[3];
        //2.创建学生对象
        Student s1 = new Student(1, "阿芬", 20);
        Student s2 = new Student(2, "阿红", 19);
        Student s3 = new Student(3, "蕊蕊", 18);
        //3.把学生对象添加到数组
        arr[0] = s1;
        arr[1] = s2;
        arr[2] = s3;

        //要求1:再次添加一一个学生对象,并在添加的时候进行学号的唯一性判断。
        Student s4 = new Student(4, "阿华", 18);

        //唯一性判断(定义一个方法)
        //1.已存在---不用添加
        //2.不存在---就可以把学生对象添加到数组
        boolean flag = contains(arr, s4.getId());
        if (flag) {
            //1.已存在---不用添加
            System.out.println("当前id重复,请修改后重新输入");
        } else {
            //2.不存在---就可以把学生对象添加到数组

            //把s4添加到数组中
            //1.数组已满---创建一个新的数组,新数组长度=老+1
            //2.数组没有满---直接添加
            int count = getCount(arr);
            if (count == arr.length) {
                //已满
                //创建一个新的数组,长度=老数组+1
                //老数组元素拷贝到新数组当中
                Student[] newArr = creatNewArr(arr);
                //[s1,s2,s3]
                //[s1,s2,s3,null]
                //添加数据
                newArr[count] = s4;
                //要求2:添加完毕之后,遍历所有学生信息。
                printArr(newArr);
            } else {
                /*未满
                [s1,s2,null]
                getCount获取的是2,表示数组中已经有了两个元素
                下一次添加数据,就是添加到2索引的位置
                 */
                arr[count] = s4;
                //要求2:添加完毕之后,遍历所有学生信息。
                printArr(arr);
            }
        }
        // 要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
        //找到id在数组中对应的索引
        int index = getIndex(arr, 4);
        System.out.println(index);
    }

    //我要干嘛? 找到id在数组中的索引
    //我需要什么? 数组 id
    //调用处是否需要继续使用方法的结果? 要
    public static int getIndex(Student[]arr,int id){
        for (int i = 0; i < arr.length; i++) {
            Student s = arr[i];
            if (s != null){
                int sid=s.getId();
                if (sid==id){
                    return i;
                }
            }
        }
        return -1;
    }


    //要求2:添加完毕之后,遍历所有学生信息。
    public static void printArr(Student[] arr) {
        for (int i = 0; i < arr.length; i++) {
            Student s = arr[i];
            if (s != null) {
                System.out.println(s.getId() + " " + s.getAge() + " " + s.getName());
            }
        }
    }


    //创建一个新的数组,长度=老数组+1
    //老数组元素拷贝到新数组当中
    public static Student[] creatNewArr(Student[] arr) {
        Student[] newArr = new Student[arr.length + 1];
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];
        }
        return newArr;
    }

    //定义一个方法判断数组中已经存了几个元素
    public static int getCount(Student[] arr) {
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != null) {
                count++;
            }
        }
        //当循环结束后,就知道数组中有几个元素
        return count;
    }


    //1.我要干嘛:唯一性判断
    //2.我干这件事需要什么才能完成   数组   Id
    //3.调用处是否需要继续使用方法的结果;只有两种结果
    public static boolean contains(Student[] arr, int id) {
        for (int i = 0; i < arr.length; i++) {
            Student s = arr[i];
            if (s != null) { //获取数组中学生对象的id
                int sid = s.getId();
                //比较
                if (sid == id) {
                    return true;
                }
            }
        }
        //当循环结束后,还没有找到一样的,表示查找的id在数组中不存在
        return false;
    }
}
最佳答案
2023-2-23 21:01:53
同时,在 main 方法中调用 getIndex 方法时,因为判断是否相等时使用了 == 而不是 equals 方法,因此您应该调用 getIndex 方法时传入的参数应该是 int 类型的 4,而不是字符串类型的 "4"。因为 id 在 Student 类中定义是一个 int 类型,不是字符串类型。

综上所述,您可以按照以下方法进行修改:

java
public static int getIndex(Student[] arr, int id) {
    for (int i = 0; i < arr.length; i++) {
        Student s = arr[i];
        if (s != null) {
            int sid = s.getId();
            if (sid == id) {
                return i;
            }
        }
    }
    return -1;
}
java
// 要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
// 找到id在数组中对应的索引
int index = getIndex(arr, 4);
if (index != -1) {
    for (int i = index; i < arr.length - 1; i++) {
        arr[i] = arr[i + 1];
    }
    arr[arr.length - 1] = null;
    //要求4:删除完毕之后,遍历所有学生信息。
    printArr(arr);
} else {
    System.out.println("该学生不存在,无法删除");
}

最佳答案

查看完整内容

同时,在 main 方法中调用 getIndex 方法时,因为判断是否相等时使用了 == 而不是 equals 方法,因此您应该调用 getIndex 方法时传入的参数应该是 int 类型的 4,而不是字符串类型的 "4"。因为 id 在 Student 类中定义是一个 int 类型,不是字符串类型。 综上所述,您可以按照以下方法进行修改: java java
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-23 21:01:53 | 显示全部楼层    本楼为最佳答案   
同时,在 main 方法中调用 getIndex 方法时,因为判断是否相等时使用了 == 而不是 equals 方法,因此您应该调用 getIndex 方法时传入的参数应该是 int 类型的 4,而不是字符串类型的 "4"。因为 id 在 Student 类中定义是一个 int 类型,不是字符串类型。

综上所述,您可以按照以下方法进行修改:

java
public static int getIndex(Student[] arr, int id) {
    for (int i = 0; i < arr.length; i++) {
        Student s = arr[i];
        if (s != null) {
            int sid = s.getId();
            if (sid == id) {
                return i;
            }
        }
    }
    return -1;
}
java
// 要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
// 找到id在数组中对应的索引
int index = getIndex(arr, 4);
if (index != -1) {
    for (int i = index; i < arr.length - 1; i++) {
        arr[i] = arr[i + 1];
    }
    arr[arr.length - 1] = null;
    //要求4:删除完毕之后,遍历所有学生信息。
    printArr(arr);
} else {
    System.out.println("该学生不存在,无法删除");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 17:20:24 | 显示全部楼层
本帖最后由 一颗yan 于 2023-5-6 17:53 编辑

兄弟,你要不要看下main方法中的第一个else中的 代码
改成
int index = getIndex(newArr, 4);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 17:54:37 | 显示全部楼层
在代码中的第39行,getIndex方法实现时已经正确返回了目标学生ID在数组中的索引。但是,在输出结果时没有考虑到返回值为-1的情况。因此,在目标ID不存在于数组中的情况下,程序会输出-1而不是提示删除失败。

为了满足要求3,当返回值为-1时应该输出"删除失败"的提示信息,代码可以修改为:
// 要求3:通过id删除学生信息,如果存在,则删除,如果不存在,则提示删除失败。
//找到id在数组中对应的索引
int index = getIndex(arr, 4);
if (index == -1) {
    System.out.println("删除失败");
} else {
    // 存在该元素,进行删除操作
    for (int i = index; i < arr.length - 1; i++) {
        arr[i] = arr[i+1];
    }
    arr[arr.length - 1] = null;
}

这样就能够正确地进行删除操作,并在需要时给出提示信息。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 19:32:10 | 显示全部楼层
sfqxx 发表于 2023-5-6 17:54
在代码中的第39行,getIndex方法实现时已经正确返回了目标学生ID在数组中的索引。但是,在输出结果时没有考 ...

我的最佳超过你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 19:56:46 | 显示全部楼层


我要逆袭
话说你咋没情商
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 20:00:12 | 显示全部楼层

谁像你啊,那么晚不睡觉
没你那么空
可不能误了学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 20:03:17 | 显示全部楼层
sfqxx 发表于 2023-5-6 20:00
谁像你啊,那么晚不睡觉
没你那么空
可不能误了学习


有那么爱学习吗
我得在学校把作业做完,早点“睡觉”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 20:06:01 | 显示全部楼层
sfqxx 发表于 2023-5-6 19:56
我要逆袭
话说你咋没情商

什么情商,你以为我会让着你(无讽刺,可能语气不对,加个表情吧
逆袭是不太可能滴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 20:23:25 | 显示全部楼层
歌者文明清理员 发表于 2023-5-6 20:06
什么情商,你以为我会让着你(无讽刺,可能语气不对,加个表情吧)
逆袭是不太可能滴

呵呵,看着吧
现在才月初呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 20:27:12 | 显示全部楼层
sfqxx 发表于 2023-5-6 20:23
呵呵,看着吧
现在才月初呢

az
先让我去哭一会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-6 22:02:38 | 显示全部楼层

我才最惨
比不过tyh,sfqxx,你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表