2013-02-18 156 views
0

目前正在开发一个执行一堆函数的java程序,其中一个函数是删除一系列按字母顺序排列的单词。我以动物为例。deleteRange函数只删除第一个和最后一个

这里是之前执行deleteRange功能的显示列表:

cat 
chinchilla 
horse 
mouse 
rat 

我问要删除的程序栗鼠鼠标,但它不包括马。

public boolean deleteRange(String start, String stop){ 
    boolean result = false; 
    int begin = Find(start); 
    int end = Find(stop); 
    while(begin<end){ 
     Delete(storage[begin]); 
     begin++; 
     result = true; 
    } 
    return result; 
} 

我删除功能:

public boolean Delete(String value){ 
    boolean result = false; 
    int location; 
    location = Find(value); 
    if (location >= 0) { 
     moveItemsUp(location); 
     numUsed--; 
     result = true; 
    } 
    return result; 
} 

我的查找功能:

public int Find(String value) { 
    int result = -1; 
    int index = 0; 
    boolean found = false; 
    while ((index < numUsed) && (!found)) { 
     found = (value.equals(storage[index])); 
     if (!found) 
      index++; 
    } 
    if (found) 
     result = index; 
    return result; 
} 

我moveitemsup功能:

private void moveItemsUp(int start){ 
    int index; 
    for (index = start; index < numUsed-1; index++){ 
     storage[index] = storage[index+1]; 
    } 
} 

回答

0

所以,你要删除数组索引1-3 -

删除数组索引1后,您的以前的索引3现在变成2并且您正在增加“开始”。所以现在您删除索引2 ..在本例中,这是鼠标..所以马会被跳过。

相反,你要保留的元素数量删除(结束 - 开始+ 1)

int count = end - begin + 1; 
while (count > 0) { 
Delete(storage[begin]); 
} 

类似的规定。

+0

生病给它一个尝试 – user1801067 2013-02-18 23:33:30

+0

抱歉这么晚才回复,拖延。哈哈。这确实工作顺便说一句。 – user1801067 2013-02-19 02:37:57

0

为什么你不尝试类似这样的东西,如果你的列表是在一个ArrayList(没有Java的东西在这个盒子上,所以这还没有经过测试)。

public boolean deleteRange(String start, String stop) { 
    for(Iterator<String> iter = storage.iterator();iter.hasNext();) { 
     String element = iter.next(); 
     if(element.compareTo(start) >= 0 && element.compareTo(stop) <= 0) { 
      iter.remove(); 
     } 
    } 
} 
+0

使用集合是一个好主意,但你在那里做什么? if(element.compareTo(start)> = 0 && element.compareTo(stop)<= 0) iter.remove(); “那是什么? – Kent 2013-02-19 00:01:20

+0

我看不到任何问题。清楚地表明这些词按字母顺序排列(即排序),所以'compareTo'语句是有效的。 – Steinar 2013-02-19 00:51:01

+0

这是假设数据已排序,这是我们在问题中给出的内容,compareTo语句只有在单词位于开始和结束单词(含)之间时才会计算为真。它完全消除了对Delete,Find和moveItemsUp功能的需求。 – 2013-02-19 03:47:41

0

我可以看到的问题是:

问题1

你增加begin指数和 “缩水(不是真的缩小)” 在同一时间数组,每个删除之后。

例如

[a,b,c,d,e,f],说要删除b-e指数1-4

第一你,那么你moveItemsUp删除后删除b (index 1)。所以数组是: [a,c,d,e,f,f],那么你begin++开始为2,它指向d,跃过c

问题2

,如果你固定的问题1,是你应该考虑的另一件事,删除后,如果它是你想要的,数组将是[a,f,f,f,f,f]

btw,为什么不考虑使用LinkedList?删除应该快得多。

0
int begin = Find(start); 
    int end = Find(stop); 
    int count = end - begin; 
    for (int i=0; i <= count; i++){ 
     Delete(storage[begin]); 
     result = true; 

改变了一些代码,这一点,使工作=)

相关问题