【问题标题】:Java Getting Warning on Compiling [duplicate]Java在编译时收到警告[重复]
【发布时间】:2020-07-10 14:49:37
【问题描述】:

我正在编写一个可以编译的程序,但是代码给了我一个警告,说它使用了未经检查或不安全的操作。用 -Xlint 重新编译。我找不到错误。请帮我解决这个问题。

import java.io.*;
import java.util.*;
public class A1{

    private HashMap<String,ArrayList<Integer>> data= new HashMap<String,ArrayList<Integer>>();
    public  void main () throws IOException{
        BufferedReader ob=new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(ob.readLine());
        for(int i=0;i<t;i++){
            String a=ob.readLine();
            String spl[]= a.split(" ");
            ArrayList<Integer> inputs= new ArrayList<Integer>();
            for(int j=0;j<Integer.parseInt(spl[0]);j++){
            int prices=Integer.parseInt(ob.readLine());
            inputs.add(prices);
            }
            Collections.sort(inputs);
            data.put(spl[1],inputs);
        }
        Iterator iter = data.entrySet().iterator();
        while(iter.hasNext()){
            Map.Entry ele = (Map.Entry)iter.next();
            int fund=Integer.parseInt((String)ele.getKey());
            System.out.println(maxhouse(fund,(ArrayList<Integer>)ele.getValue()));
        }
    }
    int maxhouse(int fund,ArrayList<Integer> a){
        int sum=0;
        int c=0;
        for(int i=0;i<a.size();i++){
            sum=sum+a.get(i);
            if(sum<fund){
                c++;
            }
            else if(sum==fund){
                c++;
                break;
            }
            else{
                break;
            }
        }
        return c;
    }
}

【问题讨论】:

  • 这能回答你的问题吗? What is a raw type and why shouldn't we use it?
  • 您正在使用不带类型参数的IteratorMap.Entry切勿使用原始类型。您应该提供正确的类型参数。
  • 更改为Iterator iter = data.entrySet().iterator();Iterator&lt;Entry&lt;String, ArrayList&lt;Integer&gt;&gt;&gt; iter = data.entrySet().iterator();Map.Entry ele = (Map.Entry)iter.next();Entry&lt;String, ArrayList&lt;Integer&gt;&gt; ele = iter.next(); 以摆脱您的原始类型。
  • 你用 -Xlint 重新编译了吗?
  • 谢谢先生,现在错误消失了,我没注意到。

标签: java bluej


【解决方案1】:

您可以在此处进行一些更改,根据 cmets 的某些更改不应该使用 RAW 类型。因此将迭代器更改为 -

Iterator<Entry<String, ArrayList<Integer>>> iter = data.entrySet().iterator();

然后将您的 Map.Entry 更改为 -

Entry<String, ArrayList<Integer>> ele = iter.next();

您还可以利用 java8 Map.foreachlambda expressions 来避免所有这些,并使代码更加出色和美观。

data.forEach((key,value) -> {
            int fund = Integer.parseInt(key);
            System.out.println(maxhouse(fund, value));
});

并避免编写使代码更干净。

Iterator iter = data.entrySet().iterator();
while(iter.hasNext()){
 Map.Entry ele = (Map.Entry)iter.next();
 int fund=Integer.parseInt((String)ele.getKey());
 System.out.println(maxhouse(fund,(ArrayList<Integer>)ele.getValue()));
}

【讨论】:

  • 您可以使用forEach,但实际上没有必要。增强的 for 循环是更好(更简单、更广泛可用、可能更快、更强大)的选择。
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多