表达式的类型必须是数组类型,但它解析为 ArrayList(试图比较两个数组中的字符串

Posted

技术标签:

【中文标题】表达式的类型必须是数组类型,但它解析为 ArrayList(试图比较两个数组中的字符串【英文标题】:The type of the expression must be an array type but it resolved to ArrayList (trying to compare string in two arrays 【发布时间】:2013-09-19 18:52:16 【问题描述】:

我试图将数组中的每个字符串或 int 与另一个数组进行比较,然后根据字符串是否存在于另一个数组中来打印结果: 下面是整个代码: 尝试使用 .equals 比较两个值时,我在 for 循环中遇到错误(不确定其方法是否正确,...我是新手)请帮忙!

public class comparer 
public void compare ()

    ArrayList NameofFileinDir = new ArrayList ();
    ArrayList Stocks = new ArrayList();
    // populate array with files names in dir
    try    
        Scanner reads = new Scanner (new File("G:/Programming/StockDataDownload/NameOfFileinDir.txt"));
        String FileCode;
        while (reads.hasNext())  
               FileCode = reads.nextLine(); //read next line
                               NameofFileinDir.add(FileCode);

        
        reads.close();
        
        catch (IOException e)  
        
    // populate array with original stocks
    try    
        Scanner reads = new Scanner (new File("G:/Programming/StockDataDownload/AllSecurities.txt"));
        String StockCode;
        while (reads.hasNext())  
               StockCode = reads.nextLine(); //read next line
               Stocks.add(StockCode);

        
        reads.close();
         for(int i = 0; i < Stocks.size(); i++) 

             for (int j = 0; j < NameofFileinDir.size(); j++) 
                    if (Stocks[i].equals(NameofFileinDir[j])) > 0) 
                        System.out.println("Stock:" + Stocks[i]);
                    else
                        System.out.println("Stock not in files:" + Stocks[i]);
                    
                    
             

        
        catch (IOException e)  
        


【问题讨论】:

代码中有很多编译时错误。使用数组而不是 ArrayList。 【参考方案1】:

您不能在 ArrayList 上使用数组表示法。您需要改为致电get(index)

【讨论】:

【参考方案2】:

将 Stocks[i] 更改为 Stocks.get(i) 并将 NameofFileinDir[j] 更改为 NameofFileinDir.get(j)

其他建议:

还将 NameofFileinDir 设置为 A hashSet 以获得更好的性能

还遵循 java camelCase 命名约定,例如将 NameofFileinDir 更改为 nameofFileinDir

【讨论】:

【参考方案3】:

您无法通过使用[] 运算符(如数组)来获取ArrayList 对象。使用ArrayList 上的get() 方法来获取对象。 所以改代码

 if (Stocks[i].equals(NameofFileinDir[j])) > 0)   

  if (Stocks[i].equals(NameofFileinDir.get([j]))) > 0) 

【讨论】:

【参考方案4】:

你的错误在这里:

if (Stocks[i].equals(NameofFileinDir[j])) > 0) 

首先,你应该说Stocks.get(i).equals(NameofFileinDir.get(j) equals 函数返回一个布尔值,因此您可以比较 true/false &gt; 0。 您可以直接删除&gt; 0)

【讨论】:

【参考方案5】:

如果您使用的是 ArrayList,那么您需要使用 get(index) 方法来访问该索引处的变量。 .equals(object) 也返回一个布尔值,所以不需要 > 0

if (Stocks.get(i).equals(NameOfFileINDir.get(j)) 

【讨论】:

【参考方案6】:

    ArrayList 不是arrayget the element at index i 的语法不同:list.get(i)arr[i]。阅读ArrayList,尤其是get(int) 方法。

    研究String.equals(Object) 返回的内容及其含义。看一眼Object.equals(Object) 也不会有什么坏处,因为java 中的每个对象都默认得到这个。

    考虑使用 foreach 循环而不是旧的 for 循环。旧的 for 循环可能非常有用,但这里没有意义。看看这有多干净:

    for (String stock : Stocks) 
        for (String filename : NameofFileinDir) 
            if (stock.equals(filename)) 
                System.out.println(" Stock: " + stocks);
             else 
                System.out.println("Stock not in files: " + stocks);
            
        
      
    

    ArrayList Stocks = new ArrayList();。凉爽的。所以你有一个ArrayList。什么的?!现在,这在技术上并不违法,但是如果您的 java 编译器支持类型参数,那么您确实需要使用它们。改为写List&lt;String&gt; stocks = new ArrayList&lt;String&gt;()。现在每个阅读您的代码的人都会立即知道该列表包含什么。此外,编译器将保证您的列表包含字符串。如果您尝试做一些疯狂或愚蠢的事情,例如将一些整数和映射与您的字符串一起放入列表中,编译器会呕吐。

    如果您在 if..else 中打印的内容就是您的意思,那么您的逻辑存在致命缺陷。如果您碰巧比较的当前股票字符串和文件字符串不相等,则打印“股票不在文件列表中”。但从逻辑上讲,这是否意味着股票字符串和文件字符串都不相等?

【讨论】:

【参考方案7】:

如果你不想为每个循环使用,那么你可以按照这个。

for(int i = 0; i < Stocks.size(); i++) 
    for (int j = 0; j < NameofFileinDir.size(); j++) 
        if (Stocks[i].equals(NameofFileinDir[j])) > 0) 
            System.out.println("Stock:" + Stocks[i]);
        else
            System.out.println("Stock not in files:" + Stocks[i]);
        
    

在上面的代码中,不是 Stocks[i],而是:

for(int i = 0; i < Stocks.size(); i++) 
    for (int j = 0; j < NameofFileinDir.size(); j++) 
        if (Stocks.get(i).equals(NameofFileinDir.get(j))) > 0) 
              System.out.println("Stock:" + Stocks[i]);
        else
              System.out.println("Stock not in files:" + Stocks.get(i));
        
    

【讨论】:

以上是关于表达式的类型必须是数组类型,但它解析为 ArrayList(试图比较两个数组中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

表达式的类型必须是数组类型,但解析为 char

第六章 数组

GO语言学习系列六——GO的数组 array与切片 slice

生成与解析JSON~简单入门

javascript的Array对象解析

4复合类型