-1

解決しました。答えは交換でした

    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 開発者です)、私の要素から少し外れています。機能するようになると、クリーンアップが行われます。これは単に「ラフ ドラフト」であり、より大きなプロジェクトの実現可能性 (または実現不可能性) を示すことのみを目的としています。にもかかわらず、すべての回答に感謝します! 各回答に続く特定のコメント。

-トム

4

2 に答える 2

0

OPに両方の編集を加えた後でも、期待される結果と実際の結果がどうなるかはまだ明確ではありません. また、質問の内容も明確ではありません。不明確で、尋ねられていない質問に答えるのは非常に困難です。しかし、サンプルコードに基づいて、あなたが探しているものに近づくかもしれないサンプルテストプログラムを次に示します...多分?

import java.util.*;

public class Question19369420 {
    private static String search;

    public static void main(String[] args) {

        search = "sgfastol";

        List<String> input = new ArrayList<>();
        input.add("2013-10-15 08:28:31,514~stQAEFV~establishAgreementSummary~2~5234 ms.");
        input.add("2013-10-15 08:28:22,442~sgFASTOL~retrieveParty~2~1776 ms.");
        input.add("2013-10-15 08:27:37,333~sfRPDesktop~modifyParty~2~1744 ms.");
        input.add("2013-10-15 08:28:14,719~sgITL~retrieveParty~2~1702 ms.");
        input.add("2013-10-15 08:28:27,755~sgFASTOL~establishParty~2~1682 ms.");
        input.add("2013-10-15 08:28:39,677~sfRPDesktop~retrieveParty~2~1679 ms.");
        input.add("2013-10-15 08:27:55,768~sgBLD~searchAgreementSummary~2~1495 ms.");
        input.add("2013-10-15 08:27:46,272~sgCSCWB~searchAgreementSummary~1~1402 ms.");
        input.add("2013-10-15 08:27:49,660~sfRPDesktop~retrieveParty~2~1395 ms.");
        input.add("2013-10-15 08:27:39,547~sgHERYN~searchAgreementSummary~1~1341 ms.");
        input.add("2013-10-15 08:27:47,028~sgCSCWB~retrieveCustomerProfile~1~1323 ms.");
        input.add("2013-10-15 08:27:29,795~sgFASTOL~retrieveParty~2~1296 ms.");
        input.add("2013-10-15 08:27:44,520~sfRPDesktop~retrieveParty~2~1290 ms.");
        input.add("2013-10-15 08:28:04,398~sgFASTOL~retrieveParty~2~1284 ms.");

        String action = "ptnr";
        ArrayList<String[]> results = null;
        if ("time".equals(action)) {
            results = searchLogs(input, 0);
        } else if ("ptnr".equals(action)) {
            results = searchLogs(input, 1);
        } else if ("srv".equals(action)) {
            results = searchLogs(input, 2);
        }

        if (results != null) {
            System.out.println("before sort");
            print(results);
            Collections.sort(results, createComparator(4));
            System.out.println("after sort");
            print(results);
        }

    }

    public static Comparator<String[]> createComparator(final int field) {
        return new Comparator<String[]>() {
            @Override
            public int compare(String[] a, String[] b) {
                return a[field].compareTo(b[field]);
            }
        };
    }

    public static void print(List<String[]> list) {
        for (String[] item : list) {
            System.out.println(String.format("  %s %s %s %s %s ms.", item[0], item[1], item[2], item[3], item[4]));
        }
    }

    public static ArrayList<String[]> searchLogs(List<String> input, int index) {
        System.out.println("Searching on Partner ID for " + search + "....");
        ArrayList<String[]> results = new ArrayList<>();
        for (String str : input) {
            results.add(str.split("~"));
        }
        ArrayList<String[]> finalResults = new ArrayList<>();
        for (String[] searchItems : results) {
            String lowerField = searchItems[index].toLowerCase();
            if (lowerField.equals(search)) { // or lowerField.contains(search)
                finalResults.add(searchItems);
            }
        }
        return finalResults;
    }
}

プログラムを実行した結果の出力は次のとおりです。

Searching on Partner ID for sgfastol....
before sort
  2013-10-15 08:28:22,442 sgFASTOL retrieveParty 2 1776 ms. ms.
  2013-10-15 08:28:27,755 sgFASTOL establishParty 2 1682 ms. ms.
  2013-10-15 08:27:29,795 sgFASTOL retrieveParty 2 1296 ms. ms.
  2013-10-15 08:28:04,398 sgFASTOL retrieveParty 2 1284 ms. ms.
after sort
  2013-10-15 08:28:04,398 sgFASTOL retrieveParty 2 1284 ms. ms.
  2013-10-15 08:27:29,795 sgFASTOL retrieveParty 2 1296 ms. ms.
  2013-10-15 08:28:27,755 sgFASTOL establishParty 2 1682 ms. ms.
  2013-10-15 08:28:22,442 sgFASTOL retrieveParty 2 1776 ms. ms.
于 2013-10-14T21:48:19.303 に答える