1

我试图编写一个简单的问题,如下所示:

本周将有你整个部门的重要会议。你清楚地记得你的老板告诉过你这件事。您唯一忘记的是会议将在一周中的哪一天举行。

你问了你的六位同事关于这次会议的事。他们谁都不知道它会在哪一天发生,但他们每个人都记得有一天它不会发生。他们记得的日子是不同的。对于像你这样聪明的程序员来说,这足以确定会议的日期。

现在我为它创建了两个数组,一个包含所有工作日,一个包含所有不会举行会议的日子,然后从中创建两个列表。

public static void main(String[] args) {
    String[] notOnThisDay={"Sunday", "Monday", "Tuesday", "Wednesday",   "Thursday", "Friday"};
    String[] weekdays={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    List<String> list1=Arrays.asList(weekdays);
    List<String> list2=Arrays.asList(notOnThisDay);
    Iterator<String> iter=list1.iterator();
    
    while(iter.hasNext()) {
        if(list2.contains(iter.next())) {
            iter.remove();
        }
    }

    for(String x:list1) {
        System.out.println(x);
    }
}

我的策略是遍历工作日列表,如果我发现列表中也存在任何一天notonThisDay,则将其删除。因此,我只剩下要举行会议的那一天了,但该方法似乎有问题iter.remove()

请指出错误。如果我的算法很好,请给我建议。如果有更好的算法,我接受建议。

4

7 回答 7

2

集合有一个完美的 removeAll() 方法。

于 2012-07-15T06:05:09.997 回答
2

asList 返回的列表非常有限,根本不支持remove。制作链表并将所有项目添加到 em,并阅读关于删除中间迭代的文档。或使用其他解决方案之一。

于 2012-07-15T06:17:33.880 回答
2

你的问题是Arrays.asList()返回一个固定大小的列表。您最好使用已知类型列表的构造函数之一,例如new ArrayList( ... )or new LinkedList( ... )

于 2012-07-15T06:18:17.623 回答
1

请注意,如果您有 6 个不同的日子不在,那么最终列表不可能 > 1,因为我不认为任何人很快就会在一周内增加更多天数。因此,您可以停止查找不在notOnthisDay列表中的星期几。因此,使用一组Set它不在的星期几并快速查找:

Set notDays = new HashSet(notOnThisDay);
String dayOfMtg = null;
for(String day : weekdays) {
   if(notDays.contains(day) {
      //Store response
      dayOfMtg = day;
      //Stop searching, you've found it.
      break;
   }
}
System.out.println("Meeting is on: "+dayOfMtg);
于 2012-07-15T06:13:36.243 回答
1

用于LinkedList正在修改的列表。

List<String> list1=new LinkedList<String>(Arrays.asList(weekdays));

它会起作用的。 Iterator.remove() 是一个可选操作,并非每个 Iterator 或其基础集合都支持。

从基础集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 时,此方法只能调用一次。如果在迭代过程中以除调用此方法之外的任何方式修改了基础集合,则迭代器的行为是未指定的。

抛出: UnsupportedOperationException - 如果此迭代器不支持删除操作。IllegalStateException - 如果还没有调用下一个方法,或者在最后一次调用下一个方法之后已经调用了 remove 方法。

于 2012-07-15T06:19:49.180 回答
0

一般来说,你必须小心地从你正在迭代的集合中删除东西。也许您可以找到避免这种情况的方法?

于 2012-07-15T06:06:58.503 回答
0

Arrays.asList创建一个不可修改的列表。从Javadoc:返回由指定数组支持的固定大小的列表。你不能添加它;你不能从中删除。您不能在结构上修改列表。

将其包装在一个可修改的列表中,如下所示:

someList.addAll(Arrays.asList(newArray));

这会产生一些额外的垃圾,但您可以对其进行变异。

您的代码现在应该如下所示。

public static void main(String[] args) 
{
    String[] notOnThisDay={"Sunday", "Monday", "Tuesday", "Wednesday",   "Thursday", "Friday"};
    String[] weekdays={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    //List<String> list1=Arrays.asList(weekdays);
    //List<String> list2=Arrays.asList(notOnThisDay);

    List<String> list1=new ArrayList<String>();
    List<String> list2=new ArrayList<String>();
    list1.addAll(Arrays.asList(weekdays));
    list2.addAll(Arrays.asList(notOnThisDay));

    Iterator<String> iter=list1.iterator();
    //ListIterator<String> iter = list1.listIterator();  Better to use

    while(iter.hasNext()) {
        if(list2.contains(iter.next())) {
            iter.remove();
        }
    }

    for(String x:list1) {
        System.out.println(x);
    }
}
于 2012-07-15T06:35:29.603 回答