JAVA。请问代码该如何修改才能正常运行

JAVA。请问代码该如何修改才能正常运行?为什么要这么修改?请给出详细解答

import java.io.Reader;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Test {
    public static void main(String[] args){
        //key值不能重复
        Map<Integer,Reader> map = new HashMap<>();//HashMap中的数据是无序的<id, reader>,对于HashMap来说,r1与r2的值是一样的,则
        Map<Integer,Reader> map = new TreeMap<>();//TreeMap中的数据是有序的<id,reader>
        Reader r1 = new Reader(1,"张三");
        Reader r2 = new Reader(2,"张三");
        Reader r3 = new Reader(3,"张三");

        //添加映射
        map.put(r1.id, r1);
        map.put(r2.id, r2);
        map.put(r3.id, r3);

        System.out.println(map.size());

        //根据key值删除映射
        map.remove(1);

        //根据key集遍历map
        Set<Integer> Keys = map.keySet();
        for(Integer key:keys){
            System.out.println(key + ":" + map.get(key));//根据key值获取value的值
        }

        System.out.println();

        //根据entry集遍历map
        for(Map.Entry<Integer, Reader> entry : map.entrySet() ) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
        Collection<Reader> values = map.values();
        for(Reader reader:values){
            System.out.println(reader);
        }

        Map<Reader, Integer> map2 = new HashMap<>();//什么样的Reader对象是重复的
        map2.put(r1, r1.id);
        map2.put(r2, r2.id);
        map2.put(r3, r3.id);//<r1, r1.id>,<r2, r2.id>,<r3, r3.id>

        System.out.println(map2.size());
        for(Map.Entry<Reader, Integer> entry : map2.entrySet()){//entry = <key,value>
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }

    }
}


你这个里面有多处错误:

  1. 局部变量不能重名,你这里定义了两个叫map的变量,需要删掉一个
  2. java.io.Reader 没有 Reader (int,String) 这样的构造函数,你这里用的Reader应该是自定义的,而不是java.io包下的
  3. Java 是区分大小写的。 set那里的keys,一个大写K一个小写k了

修改后代码如下


import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
 
public class Test {
    public static void main(String[] args){
        //key值不能重复
//        Map<Integer,Reader> map = new HashMap<>();//HashMap中的数据是无序的<id, reader>,对于HashMap来说,r1与r2的值是一样的,则
        Map<Integer,Reader> map = new TreeMap<>();//TreeMap中的数据是有序的<id,reader>
        Reader r1 = new Reader(1,"张三");
        Reader r2 = new Reader(2,"张三");
        Reader r3 = new Reader(3,"张三");
 
        //添加映射
        map.put(r1.id, r1);
        map.put(r2.id, r2);
        map.put(r3.id, r3);
 
        System.out.println(map.size());
 
        //根据key值删除映射
        map.remove(1);
 
        //根据key集遍历map
        Set<Integer> keys = map.keySet();
        for(Integer key:keys){
            System.out.println(key + ":" + map.get(key));//根据key值获取value的值
        }
 
        System.out.println();
 
        //根据entry集遍历map
        for(Map.Entry<Integer, Reader> entry : map.entrySet() ) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
        Collection<Reader> values = map.values();
        for(Reader reader:values){
            System.out.println(reader);
        }
 
        Map<Reader, Integer> map2 = new HashMap<>();//什么样的Reader对象是重复的
        map2.put(r1, r1.id);
        map2.put(r2, r2.id);
        map2.put(r3, r3.id);//<r1, r1.id>,<r2, r2.id>,<r3, r3.id>
 
        System.out.println(map2.size());
        for(Map.Entry<Reader, Integer> entry : map2.entrySet()){//entry = <key,value>
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
 
    }
}

class Reader{
    int id;
    String name;

    public Reader(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

你的Reader这个是什么类呢,这俩名字也不能一样

img

public class Test {

     public static void main(String[] args){
            //key值不能重复
            Map<Integer, Reader> map = new HashMap(); //HashMap中的数据是无序的<id, reader>
 
            
            Reader r1 = new Reader(1, "张三");
            Reader r2 = new Reader(2, "李四");
            Reader r3 = new Reader(3, "王五");

            //添加映射
            map.put(r1.id, r1);
            map.put(r2.id, r2);
            map.put(r3.id, r3);

            System.out.println(map.size());

            //根据key值删除映射
            map.remove(1);

            //根据key集遍历map
            Set<Integer> keys = map.keySet();
            for(Integer key : keys) {
                System.out.println(key + ":" + map.get(key)); //根据key值获取value的值
            }

            System.out.println();

            //根据entry集遍历map
            for(Map.Entry<Integer, Reader> entry : map.entrySet()) {
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }

            Collection<Reader> values = map.values();
            for(Reader reader : values) {
                System.out.println(reader);
            }

            Map<Reader, Integer> map2 = new HashMap(); //什么样的Reader对象是重复的
            map2.put(r1, r1.id);
            map2.put(r2, r2.id);
            map2.put(r3, r3.id); //<r1, r1.id>,<r2, r2.id>,<r3, r3.id>

            System.out.println(map2.size());
            for(Map.Entry<Reader, Integer> entry : map2.entrySet()) { //entry = <key,value>
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }
        }
    }

class Reader {
    int id;
    String name;

    public Reader(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Reader [id=" + id + ", name=" + name + "]";
    }
}

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7566799
  • 这篇博客你也可以参考下:Java 有一个已经按升序排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
  • 除此之外, 这篇博客: Java:用户输入矩形的长和宽,使用带返回值的方法求该矩形的面积并输出中的 运行结果: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  

  • 您还可以看一下 徐无忌老师的Java进阶高手课-并发编程透彻理解课程中的 什么是多线程的上下文切换,有什么影响?如何进行优化?(二)小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    由于问题描述较为模糊,我们无法直接判断问题所在。以下是对参考资料的分析和解决方案的尝试。

    参考资料中提供了两个代码示例,一个是找出只出现一次的元素,另一个是求交集的代码。

    首先,我们可以尝试对出现错误的代码进行检查和修改。

    对于问题描述中提到的无法得到正确结果的代码,参考资料中提供了两个版本的解决方案。

    方法一:

    public static int singleNum(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int count=0;
            for (int j = 0; j < arr.length; j++) {
                if (arr[i]==arr[j]) {
                    count++;
                }
            }
            if (count==1) {
                return arr[i];
            }
        }
        return -1;
    }
    
    public static void main(String args[]){
        int[] arr= new int[]{1,2,3,4,5,6,2,3,4,5,6,1,0};
        System.out.println(singleNum(arr));
    }
    

    这段代码的作用是找出数组中只出现一次的元素。通过遍历数组并统计每个元素的出现次数,最后返回只出现一次的元素。

    方法二:

    public static int singleNum(int[] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum=sum^arr[i];
        }
        return sum;
    }
    
    public static void main(String args[]){
        int[] arr= new int[]{1,2,3,4,5,6,2,3,4,5,6,1,0};
        System.out.println(singleNum(arr));
    }
    

    这段代码使用异或运算来找出数组中只出现一次的元素。通过将数组中的所有元素进行异或运算,最后得到的结果就是只出现一次的元素。

    接下来,我们可以尝试解释为什么需要进行这样的修改。

    方法一的问题在于,内层循环的作用是找出与当前元素相同的元素的个数,但每次循环都从数组的第一个元素开始。这种方法的时间复杂度较高,应该进行改进。

    方法二使用了异或运算,异或运算的本质是相同返回0,不同返回1。由于数组中只有一个元素出现一次,其他元素都出现了两次,那么将所有元素进行异或运算,相同的元素会互相抵消,最后留下的就是只出现一次的元素。

    综上所述,我们推荐使用方法二来解决问题,并将方法一中的内层循环进行改进,使用异或运算来找出只出现一次的元素。

    public static int singleNum(int[] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum=sum^arr[i];
        }
        return sum;
    }
    
    public static void main(String args[]){
        int[] arr= new int[]{1,2,3,4,5,6,2,3,4,5,6,1,0};
        System.out.println(singleNum(arr));
    }
    

    这样修改后的代码可以正常运行并得到正确结果。