Java,从treemap的数组列表值中删除一个方法中的对象
所以我有一个树形图,它的格式是树形图。我有一个通用类消息,T可以是文本类、语音类或媒体类。Item是消息的超类。我正在尝试删除treemap的每个列表值中的第一条属于Media类的消息。我的程序接收一个输入2,它将删除第一条媒体消息。但是当我输入1时,它列出了树映射值,当我显示它时,消息仍然存在。我知道我选择的第一条消息是媒体,因为我在删除它之前打印了它。我做错了什么Java,从treemap的数组列表值中删除一个方法中的对象,java,generics,arraylist,treemap,generic-programming,Java,Generics,Arraylist,Treemap,Generic Programming,所以我有一个树形图,它的格式是树形图。我有一个通用类消息,T可以是文本类、语音类或媒体类。Item是消息的超类。我正在尝试删除treemap的每个列表值中的第一条属于Media类的消息。我的程序接收一个输入2,它将删除第一条媒体消息。但是当我输入1时,它列出了树映射值,当我显示它时,消息仍然存在。我知道我选择的第一条消息是媒体,因为我在删除它之前打印了它。我做错了什么 public void run() { boolean res = true; do {
public void run() {
boolean res = true;
do {
System.out.println("1. List all accounts \n 2. Erase the first media" +
" message \n 3. equals Test \n 4. Quit \n\n Enter a choice " +
"(1-4)");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
switch(choice) {
case 1:
this.listAccounts();
break;
case 2:
this.eraseMedia();
break;
case 3:
this.equalsTest();
break;
case 4:
res = false;
System.exit(0);
scanner.close();
break;
}
}while(res);
}
private void listAccounts() {
String key = null;
List<Item> value = null;
Item element = null;
System.out.println("List of All Accounts");
for(Map.Entry <String, List<Item>> entry: treeMap.entrySet()) {
double charges = 0;
System.out.println("Account:" + entry.getKey());
value = treeMap.get(entry.getKey());
ListIterator<Item> iter = value.listIterator();
while(iter.hasNext()) {
element = iter.next();
System.out.println(element.toString());
charges += element.getCharge();
}
System.out.println("Total Charges: " + charges);
}
}
private void eraseMedia() {
List<Item> value = null;
for(Map.Entry <String, List<Item>> entry: treeMap.entrySet()) {
value = treeMap.get(entry.getKey());
this.eraseHelper(value);
}
}
private void eraseHelper(List<? extends Item> list) {
for(Item element: list) {
if(element instanceof Message<?>) {
Message<?> message = (Message<?>) element;
if(message.getMessage() instanceof Media) {
System.out.println(message.getMessage());
list.remove(message);
break;
}
}
}
}
public void run(){
布尔res=真;
做{
System.out.println(“1.列出所有帐户\n 2.擦除第一个媒体”+
“消息\n 3.等于测试\n 4.退出\n\n输入选项”+
"(1-4)");
扫描仪=新的扫描仪(System.in);
int choice=scanner.nextInt();
开关(选择){
案例1:
这个.listAccounts();
打破
案例2:
这个。擦除媒体();
打破
案例3:
this.equalsTest();
打破
案例4:
res=假;
系统出口(0);
scanner.close();
打破
}
}while(res);
}
私人帐户(){
字符串键=null;
列表值=空;
Item元素=null;
System.out.println(“所有账户列表”);
对于(Map.Entry:treeMap.entrySet()){
双重收费=0;
System.out.println(“帐户:+entry.getKey());
value=treeMap.get(entry.getKey());
ListIterator iter=value.ListIterator();
while(iter.hasNext()){
元素=iter.next();
System.out.println(element.toString());
charges+=element.getCharge();
}
系统输出打印项次(“总费用:+费用);
}
}
私有媒体(){
列表值=空;
对于(Map.Entry:treeMap.entrySet()){
value=treeMap.get(entry.getKey());
这个.删除帮助器(值);
}
}
私人助理(列表){
Message=(Message)元素;
if(媒体的message.getMessage()实例){
System.out.println(message.getMessage());
列表。删除(消息);
打破
}
}
}
}
如果您的eraseHelper
使用迭代器
删除项目,则效率会更高。除此之外,我没有看到任何其他发行人与删除。我只能怀疑树映射本身是否存在重复条目。为了澄清,您是否可以在删除前后的树映射中包含所有Message.hashcode()
的输出?我认为,问题在于Message类的equals
方法,因为这是找到要删除的对象的主要方法。请提供有关班级信息的更多详细信息。