2016-04-28 27 views
1

在我的追求继续我的Java教育我试图找出是否有一个本地的Java方法,快速和有效地允许查找一个ArrayList的数组中的字符串值。对数组ArrayList的反向查询

这里是我的代码,显示我想要做的事:

public void exampleArrayListofArray() { 
     ArrayList<String []> al = new ArrayList<>(); 
     al.add(new String[] {"AB","YZ"}); 
     al.add(new String[] {"CD","WX"}); 
     al.add(new String[] {"EF","UV"}); 
     al.add(new String[] {"GH","ST"}); 
     al.add(new String[] {"IJ","QR"}); 
     al.add(new String[] {"KL","OP"}); 
     displayArrayListofArray(al); 
    } 

    public void displayArrayListofArray(List<String []> al) { 

     for (String [] row : al) 
      for (int column = 0; column <= 1 ; column ++){ 
       System.out.println("Value at Index Row " + al.indexOf(row) + 
         " Column " + column + " is " + (row)[column]); 
      } 

     String lookUpString = "YZ"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "ST"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "IJ"; 
     lookUpMethod(al, lookUpString); 
     lookUpString = "AA"; 
     lookUpMethod(al, lookUpString); 
    } 

    public void lookUpMethod(List<String []> al, String lookUpString) { 
     boolean isStringFound = false; 
     for (String[] row : al) { 
      for (int column = 0; column <= 1; column++) { 
       if (al.get(al.indexOf(row))[column] == lookUpString) { 
        System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column); 
        isStringFound = true; 
       } 
      } 
     } 
     if (!isStringFound) { 
      System.out.println("Search string '" + lookUpString + "' does not exist."); 
     } 
    } 

这是搜索我的ArrayList对于给定的字符串的最有效的方法是什么? 有什么我应该做的,使我的代码更有效率(除了不使用ArrayList)?

我知道,也许要做我在这里要做的事情,可能比ArrayList有更高效的方法,比如HashMap,但是我目前的Java知识非常有限,我正在使用ArrayList进行改进,将不得不从头开始使用HashMap。我的代码非常的最终目标是要做到以下几点:

  1. 阅读资产文本文件来加载的ArrayList
  2. 搜索的ArrayList为用户输入的值
  3. 做一些Calcs(计算)在相邻的数值搜索排
  4. 允许用户在搜索排
  5. 更新相邻值允许用户添加新行如果搜索字符串没有找到
  6. 保存更改回资产文本文件中的人phabetical为了

Airfix膨胀

+0

有一些本地方法可以查找任何给定'Collection'的元素,但在这种情况下,您正在查看给定集合中的每个数组,所以没有原生方法。为了更简化,简洁和“声明式”算法,我会建议使用Java 8 lambda。 – Mena

+0

如果您之前已经对集合进行了排序,则可以应用二进制搜索,它将以O(log n)而不是O(n)运行。此外,如果您发现一个匹配而不是运行其他所有列表和数组,则可以从搜索方法返回。 – Palle

+3

另外我可能发现了一个bug:如果你检查字符串是否相等,你必须使用'firstString.equals(secondString)'-Method。如果两个String引用都指向内存中完全相同的位置,则== = -Operator只返回true。 – Palle

回答

1

我的回答是:不担心。

我想你是从错误的角度来看待这个问题的:如果你发现你的应用程序的用户有一个“性能”问题;如果你随后进行分析,然后分析显示你当前的“搜索”代码是“罪魁祸首”(杀死“最终用户感知性能”的单一热点);那么你必须咬紧牙关,学习使用不同于ArrayLists的数据结构。 (注意:实际上,Set/HashSet没有太大“不同”,学习如何使用它们......并不像听起来那么重要)。但是:如果你回答了上述任何有“不”的问题(比如:你没有用户抱怨糟糕的表现)......那么没有必要担心表现。

长话短说:性能确实是一个问题 - 那么你必须解决它。否则:不要尝试修复没有损坏的东西。 (就像从学习的角度来看,我仍然鼓励你保存你的代码;并且开始一个使用集合的新版本,这里有很多教程解释你需要知道的所有东西)。

但只是给你一些方向:你的主要“表现”杀手是(如你所想的那样)数据结构的不当使用。使用ArrayList存储要搜索的字符串数组没有任何优势。这增加了“两层”;每一个都需要你的代码以顺序的方式迭代这些“列表”。如果你会使用一个Set(如HashSet)来代替;并将所有“搜索字符串”添加到该集合中,您的整个匹配查找...归结起来,问这个集合:“你是否包含这个值”。

+0

“为了继续我的java教育”我认为他现在正在担心它,所以如果说问题发生 –

+0

我不认为会有任何感觉性能打击从我的用户(最初只有我)。结束ArrayList将只有100到150行。不过,我正试图用最少的时间投资获得可行的解决方案。然后,一旦它正在工作,通过修订过程,随着我的Java知识增长,我想要去收紧所有东西。我现在正在考虑,所以我知道为了未来的改进而学习什么。你能指出我的方向是一个有价值的hashset教程吗? – Airfix

+0

@Airfix注意:“感知性能”来自两个方面:首先是计算效率;然后从你的数据的大小。所以也许有150个搜索模式;但是文件中有多少行。如果你正在谈论<100000 ...可能还没有什么大不了的。但是,如果你的文件是**大** ......你会很快学到O(n * n)和O(1)之间的区别。 (搜索大o符号来理解我的意思) – GhostCat