0

私は次のコードを持っています:

Widget[] widgetArray = widgetService.getAllWidgets();
List<Widget> widgets = Arrays.asList(widgetArray);

// Prune out any Widgets named "Melvin".
Iterator<Widget> iter = widgets.iterator();
while(iter.hasNext()) {
    Widget w = iter.next();

    if("Melvin".equals(w.getName()))
        iter.remove();
}

このコードを実行すると、その行にスローされるjava.lang.UnsupportedOperationExceptionError漠然とした例外メッセージを含むランタイムが表示されます。一部のJavaはこのメソッドをサポートしておらず、この例外をスローするようです。nulliter.remove()Iteratorsremove

widgetService.getAllWidgets()を返すようにメソッドを変更できず、配列の戻り値List<Widget>でスタックします。Widget[]

だから私は尋ねます:私の配列をループして、 「 Melvinwidgets 」という名前の配列を動的に削除するにはどうすればよいですか?

4

4 に答える 4

3

余裕があれば、リストの変更可能なコピーを作成してください。交換

List<Widget> widgets = Arrays.asList(widgetArray);

List<Widget> widgets = new ArrayList<Widget>(Arrays.asList(widgetArray));
于 2012-11-21T21:32:45.207 に答える
1

イテレータが完了するまで削除を延期するだけです。

Widget[] widgetArray = widgetService.getAllWidgets();
List<Widget> widgets = Arrays.asList(widgetArray);

// Prune out any Widgets named "Melvin".
List<Widget> toRemove = new ArrayList<Widget>();
Iterator<Widget> iter = widgets.iterator();
while(iter.hasNext()) {
    Widget w = iter.next();

    if("Melvin".equals(w.getName()))
        toRemove.add(w);
}
widgets.removeAll(toRemove);

または、逆ロジックを使用して、適格なウィジェットからリストを作成するだけです。

List<Widget> widgets = new ArrayList<Widget>();
// Add all Widgets not named "Melvin"
for (Widget w : widgetService.getAllWidgets()) {
    if(!"Melvin".equals(w.getName()))
        widgets.add(w);
}
于 2012-11-21T21:28:00.487 に答える
1

asList()リストはまだ配列によって支えられています。

配列の各要素をループして、新しいリストに追加することもできます。これには2つのループが必要です。

または、文字列値を比較してからリストに追加することをお勧めします。このようにして、1つのループとまったく新しいリストができます。

于 2012-11-21T21:32:14.197 に答える
0

guavaを使用すると、そのすべてのコードを取り除き、高速で十分にテストされたライブラリに処理させることができます。

Collection<Widget> noMelvins = Collections2.filter( Arrays.asList(widgetArray), new Predicate<Widget>() {
    @Override public boolean apply( final Widget arg) {
        return !"Melvin".equals(arg.getName());
    }
});
于 2012-11-21T21:35:27.367 に答える