Iamが配列内の各文字列またはintを別の配列と比較しようとし、次に文字列が他の配列に存在するかどうかに従って結果を出力します:以下はコード全体です:を使用して2つの値を比較しようとすると、forループでエラーが発生します.equals(正しい方法であるかどうかはわかりませんが、...これは初めてです)助けてください!
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
はarray
ではありません。 _get the element at index i
_の構文は異なります:list.get(i)
vs _arr[i]
_。 ArrayList
、特にget(int)
メソッドについて読んでください。
String.equals(Object)
が何を返し、それが何を意味するかを調べます。 Object.equals(Object)
をちらっと見ても問題ありません。これは、Javaのすべてのオブジェクトがデフォルトでこれを取得するためです。
古いforループの代わりにforeachループの使用を検討してください。古い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>()
を記述してください。今すぐコードを読んでいる全員リストが何を保持しているかを知っています。また、コンパイラは、リストにonlyに文字列が含まれることを保証します。いくつかの整数と文字列を含むリストにマップすると、コンパイラーが吐き出します。
If..elseに出力する内容が意図したとおりである場合、ロジックに致命的な欠陥があります。現在のストック文字列と比較しているファイル文字列が等しくない場合は、「ファイルリストにないストック」を出力します。しかし、論理的には、これはストック文字列とファイル文字列のいずれも等しくないことを意味しますか?
ArrayList
では配列表記を使用できません。代わりにget(index)
を呼び出す必要があります。
stocks [i]をStocks.get(i)に、NameofFileinDir [j]をNameofFileinDir.get(j)に変更します。
追加の提案:
また、NameofFileinDirをハッシュセットにしてパフォーマンスを向上させる
また、Java camelCaseの命名規則に従って、NameofFileinDirをnameofFileinDirに変更します。
配列のような_[]
_演算子を使用して ArrayList オブジェクトを取得することはできません。オブジェクトを取得するには、get()
メソッドをArrayList
で使用します。コードを変更してください
_ if (Stocks[i].equals(NameofFileinDir[j])) > 0) {
_
に
_ if (Stocks[i].equals(NameofFileinDir.get([j]))) > 0) {
_
あなたのエラーはここにあります:
_if (Stocks[i].equals(NameofFileinDir[j])) > 0) {
_
最初に、Stocks.get(i).equals(NameofFileinDir.get(j)
と言う必要があります。equals
関数はブール値を返すため、_true/false > 0
_と比較します。 _> 0)
_をドロップするだけです
ArrayListを使用している場合は、get(index)メソッドを使用して、そのインデックスの変数にアクセスする必要があります。また、.equals(object)はブール値を返すため、0より大きい必要はありません。
if (Stocks.get(i).equals(NameOfFileINDir.get(j)) {
}
各ループに使用したくない場合は、これに従うことができます。
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));
}
}
}