表达式的类型必须是数组类型,但它解析为 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 > 0
。
您可以直接删除> 0)
【讨论】:
【参考方案5】:如果您使用的是 ArrayList,那么您需要使用 get(index) 方法来访问该索引处的变量。 .equals(object) 也返回一个布尔值,所以不需要 > 0
if (Stocks.get(i).equals(NameOfFileINDir.get(j))
【讨论】:
【参考方案6】:ArrayList
不是array
。 get 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<String> stocks = new ArrayList<String>()
。现在每个阅读您的代码的人都会立即知道该列表包含什么。此外,编译器将保证您的列表仅包含字符串。如果您尝试做一些疯狂或愚蠢的事情,例如将一些整数和映射与您的字符串一起放入列表中,编译器会呕吐。
如果您在 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(试图比较两个数组中的字符串的主要内容,如果未能解决你的问题,请参考以下文章