我正在制作一个ArrayList
String
,并且该类中的一个方法需要String
,将“紧急:”添加到其前面,并将其放置在列表的开头。我现在正在编写一个方法,该方法应该采用int
,String
的位置,并将该字符串“降级”到列表的末尾。
但是,如果字符串前面有“urgent:”,那么该方法也应该删除“urgent:”如果它被降级。一切都编译并运行,但它并没有删除“紧急:”,我不知道为什么。
public void addUrgetItem(String newItem) {
String urgentItem = newItem;
items.add(0, "urgent: " + urgentItem);
}
public void demote(int position) {
int size = items.size();
String itemAtSpot = items.get(position);
items.remove(itemAtSpot);
items.add((size-1), itemAtSpot);
if (itemAtSpot.startsWith("urgent:")) {
items.remove("urgent:");
}
}
答案 0 :(得分:5)
当你这样说时:
items.remove("urgent:");
它试图删除文字String
"紧急"从列表本身,而不是列表中的任何特定项目。相反,您需要先将该文字从itemAtSpot
中删除,然后再将其添加回List
。这看起来像这样:
public void demote(int position) {
int size = items.size();
String itemAtSpot = items.get(position);
items.remove(itemAtSpot);
if (itemAtSpot.startsWith("urgent: ")) {
itemAtSpot = itemAtSpot.substring("urgent: ".length());
}
items.add(itemAtSpot);
}
因此,在删除String
之后,您将在" urgent:"之后获取所有内容的子字符串,然后将其添加回最后的List
。
答案 1 :(得分:4)
通过调用items.remove("urgent:");
,你试图从ArrayList中删除一个不存在的字符串,一个包含"urgent"
的字符串,除了紧急之外什么也没有。相反,你必须删除" urgent"来自ArrayList持有的 String 。这可以通过使用String的replace(...)
方法来完成,替换" urgent:"与"":myString.replace("urgent:", "");
但是说到这一点,你实际上可以做得更好,因为你正在做一个共同的编程邪恶:使用字符串来保存逻辑信息,比他们应该更多的逻辑。不要让ArrayList保存字符串,为什么不让它保存自定义类的对象,可以有boolean urgent
字段的类,可以通过方法轻松设置的字段?
例如,
public class MyItem {
private String text;
private boolean urgent = false;
public MyItem(String text) {
this.text = text;
}
public MyItem(String text, boolean urgent) {
this.text = text;
this.urgent = urgent;
}
public boolean isUrgent() {
return urgent;
}
public void setUrgent(boolean urgent) {
this.urgent = urgent;
}
public String getText() {
return text;
}
@Override
public String toString() {
return text;
}
// ... equals and hashCode methods based on text only
}
和....
private List<MyItem> items = new ArrayList<>();
// .....
public void addUrgetItem(String newItem) {
MyItem item = new MyItem(newItem, true);
items.add(0, item);
}
public void demote(int position) {
int size = items.size();
MyItem itemAtSpot = items.get(position);
items.remove(itemAtSpot);
itemAtSpot.setUrgent(false);
items.add((size-1), itemAtSpot);
}