2015-08-21 3 views
0

В настоящее время я пишу программу, которая читает строки из файла и создает маркеры. Затем жетоны сохраняются в деревьях. Я не хочу дубликатов в наборе, поэтому я реализовал Comparator с правильным методом сравнения. Но все же я не могу понять, почему один элемент повторяется в деревьях.дублирующий элемент в hashset (после правильной реализации метода сравнения/сравнения)

входного файла: (13 строк)

VEG,SMALL,Corn,MOZZARELLA 
VEG,LARGE,Capsicum,CHEDDAR 
VEG,MEDIUM,Olives,COTTAGE 
VEG,MEDIUM,Garlic,MOZZARELLA 
VEG,LARGE,Peppers,CHEDDAR  
NONVEG,MEDIUM,Beef,CHEDDAR 
NONVEG,LARGE,Chicken,COTTAGE 
NONVEG,SMALL,Pork,MOZZARELLA 
NONVEG,LARGE,Mutton,CHEDDAR  
NONVEG,SMALL,Mutton,MOZZARELLA 
VEG,SMALL,Corn,MOZZARELLA 
NONVEG,MEDIUM,Beef,CHEDDAR 
NONVEG,SMALL,Mutton,MOZZARELLA 

Мой код:

public Set<Pizza> populateData(String FileName) { 

    Set<Pizza> set = new TreeSet(new Comparator<Pizza>(){ 

     @Override 
     public int compare(Pizza o1, Pizza o2) { 

      if(o1.getPizzType().compareTo(o2.getPizzType())==0) 
      { 
       if(o1.getCheeseType().compareTo(o2.getCheeseType())==0) 
       { 
        if(o1.getSize().compareTo(o2.getSize())==0) 
        { 
         if(o1.getTopping().compareTo(o2.getTopping())==0) 
         { 
          return 0; 
         } 
        } 
       } 
      } 
      return 54; 
     } 


    }); 


    File file = new File(FileName); 
    Scanner scanner=null; 

    try { 
     scanner=new Scanner(new FileInputStream(file)); 
     Pizza pizza=null; 

     while(scanner.hasNext()) 
     { 
      String line=scanner.nextLine(); 
      String words[]=new String[4]; 
      words=line.split(","); 

      pizza=new Pizza(); 

      if(words[0].trim().length()>0) 
      { 
       pt=PizzaType.valueOf(words[0].trim()); 
       pizza.setPizzType(PizzaType.valueOf(words[0].trim())); 
      } 
      if(words[1].trim().length()>0) 
      { 
       sz=(Size.valueOf(words[1].trim())); 
       pizza.setSize(Size.valueOf(words[1].trim())); 
      } 
      if(words[2].trim().length()>0) 
      { 
       tp=(words[2].trim()); 
       pizza.setTopping(words[2].trim()); 
      } 
      if(words[3].trim().length()>0) 
      { 
       ct=(CheeseType.valueOf(words[3].trim())); 
       pizza.setCheeseType(CheeseType.valueOf(words[3].trim())); 
      } 


      set.add(pizza); 

     } 

    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return set; 
} 

(выход печатается вместе с длиной строки и хэш-код)

Выход: (11 линий) {первый и последняя строка дублируется: P}

VEG SMALL Corn MOZZARELLA 22 589431969 
VEG LARGE Capsicum CHEDDAR 23 1252169911 
VEG MEDIUM Olives COTTAGE 22 2101973421 
VEG MEDIUM Garlic MOZZARELLA 25 685325104 
VEG LARGE Peppers CHEDDAR 22 460141958 
NONVEG MEDIUM Beef CHEDDAR 23 1163157884 
NONVEG LARGE Chicken COTTAGE 25 1956725890 
NONVEG SMALL Pork MOZZARELLA 25 356573597 
NONVEG LARGE Mutton CHEDDAR 24 1735600054 
NONVEG SMALL Mutton MOZZARELLA 27 21685669 
VEG SMALL Corn MOZZARELLA 22 2133927002 

Ожидаемый результат: (10 линий)

VEG SMALL Corn MOZZARELLA 
VEG LARGE Capsicum CHEDDAR 
VEG MEDIUM Olives COTTAGE 
VEG MEDIUM Garlic MOZZARELLA 
VEG LARGE Peppers CHEDDAR 
NONVEG MEDIUM Beef CHEDDAR 
NONVEG LARGE Chicken COTTAGE 
NONVEG SMALL Pork MOZZARELLA 
NONVEG LARGE Mutton CHEDDAR 
NONVEG SMALL Mutton MOZZARELLA 
+2

Ваших сравнения возвращают 0 или 54. Как правильно? – UmNyobe

+0

Вы переопределили методы 'equals' и' hashCode' 'Pizza'? – RealSkeptic

+0

@UmNyobe Возвращая все, кроме 0, сортирует список (по возрастанию/убыванию), правильно? –

ответ

2

Comparator contract требует, чтобы вернуться отрицательным, если o1 < o2, положительным, если o1 > o2, и ноль, если o1 == o2.

Что означает, что ваш код должен выглядеть

public int compare(Pizza o1, Pizza o2) { 

    int compvalue = o1.getPizzType().compareTo(o2.getPizzType()); 
    if(compvalue == 0) 
    { 
     compvalue = o1.getCheeseType().compareTo(o2.getCheeseType()); 
     ...etc.. 
     if(compvalue == 0) 
     ... 
    } 
    return compvalue; 
} 
+0

okk .. просто дождитесь секунды .. Я постараюсь ответить .. –

+0

Большое вам спасибо! Проблема решена .. –

+0

приветствуется :) – UmNyobe

Смежные вопросы