2012-04-18 35 views
0

我已经在学校给出了这个下面的问题,我已经解决了按照我的理解和解决方案如下。有人可以帮助我给出更好的解决方案。从源和前缀合并列表

问:

生产是创建两个不区分大小写的排序名单的过滤合并的软件应用程序。第一个输入列表被指定为源列表,另一个列为前缀列表。该应用程序会产生使用以下算法包含来自源和前缀列表中的项目合并列表:

的项目X是在合并后的列表,当且仅当以下条件之一为真:

一)X来自“源”列表,前缀列表中有一个项目Y是X的区分大小写字符串前缀。

b)X来自前缀列表,并且源列表中没有项目其中X是不区分大小写的字符串前缀。

完成的合并列表应该与原始两个列表中的项目具有相同的排序顺序。

我的解决方案:

public ArrayList<String> merge(List<String> srcList, List<String> preList) { 
     // If Prefixes list is empty then there cannot be a new merge list 
     if (preList.isEmpty()) { 
      return null; 
     } 
     int i = 0, j = 0; 
     int sourcesListSize = srcList.size(); 
     int prefixesListSize = preList.size(); 
     ArrayList<String> mergeList = new ArrayList<String>(); 
     // Loop through Sources list until end of the list is reached 
     //ASSUMPTION: Both SourceList and PrefixList are already sorted. 
     while (i < sourcesListSize && j<prefixesListSize) { 
      mergeList.add(preList.get(j).concat(srcList.get(i))); 
      i++; 
      j++; 
     } 
     // If Prefixes list still have items, then add it to mergeList 
     while (j < prefixesListSize) { 
      mergeList.add(preList.get(j)); 
      j++; 
     } 
     return mergeList; 

    } 

输入:

  • 源列表:{"pple","ow","enver",pic,"ull"}
  • PrefixList:{"a","c","d","e","f"}

MergeList={"apple",cow","denver","epic","full"}

我的理解是否正确?有没有最好的其他解决方案?

+0

您如何知道PrefixList中的字母与SourceList匹配?另外,你只能使用每个前缀一次吗?如果不是,则可以从PrefixList和SourceList组装“剔除”,“枯燥”和“全部”这两个字。 – 2012-04-18 22:01:25

+0

假设您的教师尚未向您提供关于如何验证前缀源对的一些指示,则需要一个单词列表。你可以找到几个[这里](http://wordlist.sourceforge.net/)。例如,您可以对文件执行二进制搜索,将文件读入一个'ArrayList'并对其进行二进制搜索,或者将其读入'HashSet'并使用'contains'方法。 – maybeWeCouldStealAVan 2012-04-18 22:17:54

回答

1

由于这是功课,我会尽量不透露太多,但每prefix的定义,下面是一些例子:

“一”是“苹果”的前缀

“牛”是“牛”

“G”的前缀是“动物园”

“栏”的前缀是“cool”的前缀

基于此,MergeList将用于以下内容?提示:在正确的MergeList中将有来自SourceList和PrefixList的项目。发布你的解决方案,我会批评它。一旦你了解了这个部分是如何工作的,你将会对如何编写解决方案有更好的了解。

SOURCELIST:{ “苹果”, “辣椒”, “丹佛”, “车库”, “动物园”}

PrefixList:{ “一”, “d”, “PE”,“木琴“,”e“}