解决。答案是替换
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开发人员),所以我有点不在我的元素中。一旦我开始运作,就会进行清理。如果你愿意的话,这只是一个“粗略的草案”,只是为了表明一个更大的项目的可行性(或缺乏)。感谢您的所有回复!每个答案都有具体的评论。
- 汤姆
答案 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.