解決しました。答えは交換でした
for (int i = 0; i < results.size(); i++)
{
lowerField = results.get(i)[2].toLowerCase();
if(lowerField.equals(search));
{
finalResults.add(results.get(i));
}
}
と
for(String[] searchItems : results)
{
lowerField = searchItems[2].toLowerCase();
if(lowerField.equals(search))
{ // or lowerField.contains(search)
finalResults.add(searchItems);
}
}
何らかの理由で、元の add(results.get(i)) ステートメントはどこかで何かを混乱させていたようですが、 add(searchItems) ステートメントはうまく機能します。
同様の問題を抱えている他の人を支援するために、この質問を適切な基準に整理して明確にし、他の人を支援できるようにしてください.
元の質問のサンプルと一致する正しい動作コード:
public static ArrayList<String[]> searchLog(ArrayList<String> searchMe, String action)
{
//ArrayList full of String arrays to break up and hold each line of the passed ArrayList
ArrayList<String[]> results = new ArrayList<String[]>();
//Same structure as above, intended to hold the lines matching the user's search criteria
ArrayList<String[]> finalResults = new ArrayList<String[]>();
//String variable used to hold the current field we're searching "toLowerCase"
String lowerField = null;
//For each string in the input ArrayList...
for (String str : searchMe)
{
//Add each line (after splitting it into an array) to the "results" ArrayList
results.add(str.split("~"));
}
//If the user chose to search on "Partner ID"
if (action.equals("ptnr"))
{
//Print line with criteria and search field
System.out.println("Searching on Partner ID for " + search + "....");
//For each line (string array) in the "results" ArrayList
for(String[] searchItems : results)
{
//Set "lowerField" equal to the current line (string array) sub 1 where Partner ID is located, and set it toLowerCase
lowerField = searchItems[1].toLowerCase();
//If the cell we're searching contains the user's search criteria
if(lowerField.contains(search))
{
//Then add the whole line to the finalResults ArrayList that we will return from this function.
finalResults.add(searchItems);
}
}
}
return finalResults;
}
ご協力いただきありがとうございます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~元の質問~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ Ok, I've got a function that's supposed to go through an ArrayList and search on a particular piece of each array in the list. 一致が見つかると、関数はその配列全体を、検索結果でいっぱいの 2 番目の ArrayList に追加します。
また、元の ArrayList から検索条件に一致しないものを単純に削除して、不必要に 2 つ目のメモリを保存しようとしたところ、同じように誤った結果が得られました。フォローする関数:
注: SEARCH は、ここで使用する前に Main 関数で既に "toLowerCase" に設定されている (public static "global" に格納されている) ユーザー入力の一部です。
public static ArrayList<String[]> searchLog(ArrayList<String> searchMe, String action)
{
ArrayList<String[]> results = new ArrayList<String[]>();
ArrayList<String[]> finalResults = new ArrayList<String[]>();
String lowerField = null;
for (String str : searchMe)
{
results.add(str.split("~"));
}
if (action.equals("ptnr"))
{
System.out.println("Searching on Partner ID for " + search + "....");
for (int i = 0; i < results.size()-1; i++)
{
lowerField = results.get(i)[1].toLowerCase();
if(lowerField.equals(search))
{
//System.out.println("one added");
finalResults.add(results.get(i));
}
}
}
return finalResults;
}
lowerField.equals(search)、lowerField.contains(search)、および lowerField.matches(search) を使用して、いくつかのバリエーションとその文字列操作を含めてみました。
私の理想的な結果は、「含む」を使用することです。ユーザーが検索できる「タイムスタンプ」は非現実的であり、現実的に検索できる日付と時刻だけでなく、より多くの情報が含まれているためです。
さて、私の結果です。
関数を実行して「ptnr」を検索すると、正しい結果が得られます。他の 2 つのいずれかで検索すると、結果は正しい NUMBER エントリを返します (一致しないエントリが削除されたことを示す println があった場合の REMOVED の正しい数を含めるため) が、保持されているエントリは表示されるのは、一致しない行と一致する行の混合バッグです。繰り返しますが、印刷された行数は正しいですが、行自体は一致する行だけではありません。
これは、searchLog() を呼び出す関数です。
if(srv)
{
System.out.println("");
System.out.println("============================= SEARCH RESULTS ===================================");
System.out.println("");
ArrayList<String[]> results = searchLog(line, "ptnr");
for (int x = 0; x < results.size(); x++)
System.out.println(results.get(x)[0] + " " + results.get(x)[1] + " " + results.get(x)[2] + " " + results.get(x)[3] + " " + results.get(x)[4] + " ms." );
System.out.println("");
System.out.println("============================= END SEARCH RESULTS ===================================");
System.out.println("");
}
上記の「line」は検索対象の ArrayList であり、「if」ブロックの「srv」はユーザー入力によって設定されたグローバル ブール値です。検索とフィルター自体ではなく、すべてが現在機能しています。
事前に感謝します。さらに情報が必要な場合はお知らせください。
編集:ええ、私はバブルソートを使用したことを知っています...炎上を始めましょう笑、しかしそれはしばらく経ちました、そしてこれは新しい仕事のための時間に敏感なユーティリティです. このユーティリティを実行しているサーバーでは、最小量のデータ処理 (1 回の実行で 300 行) で、バブルはカーソルの点滅で目的を達成します。:)
編集 2: サンプル入力データ:
2013-10-15 08:28:31,514~stQAEFV~establishAgreementSummary~2~5234 ms.
2013-10-15 08:28:22,442~sgFASTOL~retrieveParty~2~1776 ms.
2013-10-15 08:27:37,333~sfRPDesktop~modifyParty~2~1744 ms.
2013-10-15 08:28:14,719~sgITL~retrieveParty~2~1702 ms.
2013-10-15 08:28:27,755~sgFASTOL~establishParty~2~1682 ms.
2013-10-15 08:28:39,677~sfRPDesktop~retrieveParty~2~1679 ms.
2013-10-15 08:27:55,768~sgBLD~searchAgreementSummary~2~1495 ms.
2013-10-15 08:27:46,272~sgCSCWB~searchAgreementSummary~1~1402 ms.
2013-10-15 08:27:49,660~sfRPDesktop~retrieveParty~2~1395 ms.
2013-10-15 08:27:39,547~sgHERYN~searchAgreementSummary~1~1341 ms.
2013-10-15 08:27:47,028~sgCSCWB~retrieveCustomerProfile~1~1323 ms.
2013-10-15 08:27:29,795~sgFASTOL~retrieveParty~2~1296 ms.
2013-10-15 08:27:44,520~sfRPDesktop~retrieveParty~2~1290 ms.
2013-10-15 08:28:04,398~sgFASTOL~retrieveParty~2~1284 ms.
「ptnr」で検索すると出力が正しく機能し、タイムスタンプで「y」を検索すると出力されます(これは結果を生成することはありません...)すべての行を返します:
============================= SEARCH RESULTS ===================================
Searching on Partner ID for sgfastol....
before sort
after sort
2013-10-15 08:28:22,442 sgFASTOL retrieveParty 2 1776 ms.
2013-10-15 08:28:27,755 sgFASTOL establishParty 2 1682 ms.
2013-10-15 08:27:29,795 sgFASTOL retrieveParty 2 1296 ms.
2013-10-15 08:28:04,398 sgFASTOL retrieveParty 2 1284 ms.
============================= SEARCH RESULTS ===================================
Searching on Timestamp for y....
before sort
after sort
2013-10-15 08:28:31,514 stQAEFV establishAgreementSummary 2 5234 ms.
2013-10-15 08:28:22,442 sgFASTOL retrieveParty 2 1776 ms.
2013-10-15 08:27:37,333 sfRPDesktop modifyParty 2 1744 ms.
2013-10-15 08:28:14,719 sgITL retrieveParty 2 1702 ms.
2013-10-15 08:28:27,755 sgFASTOL establishParty 2 1682 ms.
2013-10-15 08:28:39,677 sfRPDesktop retrieveParty 2 1679 ms.
2013-10-15 08:27:55,768 sgBLD searchAgreementSummary 2 1495 ms.
2013-10-15 08:27:46,272 sgCSCWB searchAgreementSummary 1 1402 ms.
2013-10-15 08:27:49,660 sfRPDesktop retrieveParty 2 1395 ms.
2013-10-15 08:27:39,547 sgHERYN searchAgreementSummary 1 1341 ms.
2013-10-15 08:27:47,028 sgCSCWB retrieveCustomerProfile 1 1323 ms.
2013-10-15 08:27:29,795 sgFASTOL retrieveParty 2 1296 ms.
2013-10-15 08:27:44,520 sfRPDesktop retrieveParty 2 1290 ms.
2013-10-15 08:28:04,398 sgFASTOL retrieveParty 2 1284 ms.
最後に、私はそれがずさんであることを知っています。謝罪します。私は文字通り 3 時間費やしましたが、そのうちの 1 人はこの検索を理解しようとしていました。これは Java で書かれた UNIX ユーティリティ (Unix にはあまり詳しくない) であるため (私は .NET 開発者です)、私の要素から少し外れています。機能するようになると、クリーンアップが行われます。これは単に「ラフ ドラフト」であり、より大きなプロジェクトの実現可能性 (または実現不可能性) を示すことのみを目的としています。にもかかわらず、すべての回答に感謝します! 各回答に続く特定のコメント。
-トム