Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,从treemap的数组列表值中删除一个方法中的对象_Java_Generics_Arraylist_Treemap_Generic Programming - Fatal编程技术网

Java,从treemap的数组列表值中删除一个方法中的对象

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 {

所以我有一个树形图,它的格式是树形图。我有一个通用类消息,T可以是文本类、语音类或媒体类。Item是消息的超类。我正在尝试删除treemap的每个列表值中的第一条属于Media类的消息。我的程序接收一个输入2,它将删除第一条媒体消息。但是当我输入1时,它列出了树映射值,当我显示它时,消息仍然存在。我知道我选择的第一条消息是媒体,因为我在删除它之前打印了它。我做错了什么

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
方法,因为这是找到要删除的对象的主要方法。请提供有关班级信息的更多详细信息。