String.contains与ArrayList表现奇怪

时间:2013-10-14 21:13:57

标签: java string search arraylist string-comparison

解决。答案是替换

    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;
}

再次感谢您的帮助!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~原始问题~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~ 好吧,我有一个函数,它应该通过一个ArrayList并搜索列表中每个数组的特定部分。找到匹配后,该函数将整个数组添加到第二个完整搜索结果的ArrayList中。

我还尝试从原始ArrayList中删除任何与搜索条件不匹配的内容,以节省不必要的第二个内存并以同样的方式获得相同的错误结果。功能如下:

注意:SEARCH是一段用户输入(存储在公共静态“全局”中),在我的Main函数中已经设置为“toLowerCase”,然后才在此处使用。

    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”时,我的结果是正确的。当我搜索其他两个中的任何一个时,我的结果返回正确的条目数(当我有一个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”是用户输入设置的全局布尔值。所有这些目前都在运行,而不是搜索和过滤本身。

先谢谢你们,如果你需要更多信息,请告诉我们!

编辑:是的,我知道我使用了泡泡排序...让火焰开始哈哈,但它已经有一段时间了,这对于新工作来说是一个时间敏感的工具。在运行此util的服务器上,并且处理的数据量最少(每次运行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.

最后,我知道它很草率。我道歉。我实际上花了三个小时,其中一个一直试图找出这个搜索。它是用Java编写的unix util(不太熟悉unix)(我是一个.NET开发人员),所以我有点不在我的元素中。一旦我开始运作,就会进行清理。如果你愿意的话,这只是一个“粗略的草案”,只是为了表明一个更大的项目的可行性(或缺乏)。感谢您的所有回复!每个答案都有具体的评论。

- 汤姆

2 个答案:

答案 0 :(得分:0)

首先,您应该使用java.util.List而不是ArrayList这样的界面来提高应用程序的灵活性。您的文字表明您正在处理某种时间戳,为什么不使用java.util.Date或其他与时间有关的对象?

为什么只是为results.size()-1进行循环?这导致了许多results.size()-2次运行。设置循环结束的正确方法是i < result.size()i <= result.size()-1

您能否为您的错误提供一些输入和输出示例?

答案 1 :(得分: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.