as for the dropping you could try something like: 
void dropAllExceptA(String...names) throws InterruptedException {
        if(Tab.INVENTORY.isOpen(this.bot)){
            for(int i = 1; i < 29; i++){
                Item item = inventory.getItemInSlot(i);
                if(item != null && !item.getName().equals(names)){
                    item.interact("Drop");
                    sleep((long) random(0, 0));
                }
            }
        }else{
            tabs.open(Tab.INVENTORY);
            sleep((long) random(0, 0));
        }
    }
    void dropAllExceptB(String...names) throws InterruptedException {
        if(Tab.INVENTORY.isOpen(this.bot)){
           Item[] items = inventory.getItems();
            if(items != null) {
                for (int i = 0; i < items.length; i++) {
                      Item item = items[i];
                    if (item != null && !item.getName().equals(names)) {
                        item.interact("Drop");
                        sleep((long) random(0, 0));
                    }
                }
            }
        }else{
            tabs.open(Tab.INVENTORY);
            sleep((long) random(0, 0));
        }
    }
i dont actually know if there's alot of difference between the methods but you could alter the length of sleeps to make it quicker 
Yes i wrote 29.