2017-07-29 3 views
0

Donc, fondamentalement, mon code fait ce que dit la question. Dans la façon dont le code est présenté maintenant, il donne les résultats corrects, mais quand je change l'ordre des morceaux de code .add, il donne des résultats différents à chaque fois. Je pense que la méthode compareTo est bonne, mais ai-je oublié quelque chose? J'essaie d'obtenir le plus petit résultat.ma «plus petite méthode donne des résultats différents si l'ordre de quand les mots/nombres sont ajoutés est changé

Merci d'avance.

package lists; 

import java.util.*; 

public class Lab4 { 
    public static <T extends Comparable> int smallest(List<T> l) { 
     if (l.size() == 0) 
      return -1; 
     else { 
      Iterator<T> it = l.iterator(); 
      T smallestSoFar = it.next(); 
      T temp; 

      int smallestPos = 0; 
      int i = 0; //used to indicate position in list of next item 
      while (it.hasNext()) { 
       temp = it.next(); 

       if (temp.compareTo(smallestSoFar) > 0) { 
        smallestSoFar = temp; 
        smallestPos++; 
       } 
       i++; 
      } 

      return smallestPos; 
     } 
    } 

    public static <T extends Comparable> void deleteSmallest(List<T> l) { // for exercise 3 
    } 

    public static void main(String[] args) { 
     Vector<String> vec1 = new Vector<String>(); 
     vec1.add("Hello"); 
     vec1.add("xxxx"); 
     vec1.add("world"); 
     vec1.add("aardvark"); 

     int smallPos = smallest(vec1); 
     if (smallPos != -1) 
      System.out.println("smallest entry is " + vec1.elementAt(smallPos) + " at position " + smallPos); 
     Vector<Integer> vec2 = new Vector<Integer>(); 

     vec2.add(new Integer(47)); 
     vec2.add(new Integer(247)); 
     vec2.add(new Integer(17)); 
     vec2.add(new Integer(399)); 

     smallPos = smallest(vec2); 
     if (smallPos != -1) 
      System.out.println("smallest entry is " + vec2.elementAt(smallPos) + " at position " + smallPos); 
    } 
} 

Répondre

3

Votre test de comparaison est le mauvais sens. Actuellement, vous choisissez la plus grande valeur.

if (temp.compareTo(smallestSoFar) > 0) { 

Devrait être

if (temp.compareTo(smallestSoFar) < 0) { 

En outre, smallestPos++; devrait être smallestPos=i;

Actuellement vous retournez un décompte du nombre de fois que la valeur "plus petit" a changé.

2

Avec java8 vous pouvez rendre votre méthode smallest() plus compacte:

public static <T extends Comparable<T>> int smallest(List<T> list){ 
    return list.stream()    // get Stream<T> from list 
     .sorted(Comparable::compareTo) // Stream<T> is now sorted 
     .mapToInt(list::indexOf)  // maps Stream<T> to an IntStream consisting of indices 
     .findFirst()     // find the first value (the smallest) 
     .orElse(-1);     // if nothing found, hence list was empty, then return -1 
} 

et quand je l'ai testé avec ma fonction il n'y avait pas d'incohérences