Avatar billede baitianlong Nybegynder
20. november 2007 - 15:01 Der er 4 kommentarer og
1 løsning

problem med simpel sortering

Jeg skal bruge nogle sorterings funktioner, men det volder mig pludselig store problemer...

Jeg har lavet denne metode som test:

public static List<LibraryResult> sortLibraryResultsByTitle(List<LibraryResult> books) {

        for(int i = 0; i < books.size(); i++) {
            LibraryResult a = books.get(i);
            for(int j = 0; j < books.size(); j++) {
                LibraryResult b = books.get(j);
                if(a.getTitle().compareTo(b.getTitle()) > 0) {
                    LibraryResult temp = a;
                    books.set(i, b);
                    books.set(j, temp);
                }
            }
        }
        return books;
    }

Og skrevet denne jsp side for at teste:

<%@ page import="backend.LibraryResult" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="backend.MiscFunctions" %>
<%
    List<LibraryResult> books1 = new ArrayList<LibraryResult>();
    LibraryResult lr1 = new LibraryResult();
    lr1.setTitle("Zebraer er flotte");
    books1.add(lr1);
    LibraryResult lr2 = new LibraryResult();
    lr2.setTitle("Aber er soede");
    books1.add(lr2);
    LibraryResult lr3 = new LibraryResult();
    lr3.setTitle("Heste er store");
    books1.add(lr3);
    LibraryResult lr4 = new LibraryResult();
    lr4.setTitle("Kyllinger er smaa");
    books1.add(lr4);
    LibraryResult lr5 = new LibraryResult();
    lr5.setTitle("Grise smager godt");
    books1.add(lr5);
    LibraryResult lr6 = new LibraryResult();
    lr6.setTitle("Undulater kan flyve");
    books1.add(lr6);
    LibraryResult lr7 = new LibraryResult();
    lr7.setTitle("Antiloper er hurtige");
    books1.add(lr7);

    List<LibraryResult> books2 = MiscFunctions.sortLibraryResultsByTitle(books1);
%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head><title>Simple jsp page</title></head>
  <body>
  UNSORTED:<br><br>
  <%
      for(LibraryResult book1: books1) {
          out.write(book1.getTitle() + "<br>");
      }
  %>
  <hr>
  SORTED:<br><br>
  <%
      for(LibraryResult book2: books2) {
          out.write(book2.getTitle() + "<br>");
      }
  %>
  </body>
</html>


Men underligt nok (for mig) skriver den bare Zebraer er flotte en masse gange, naar jeg koerer siden.

Kan nogen hjaelpe mig her... Jeg ved godt jeg kunne bruge compareTo og implementere Comparable, men jeg skal bruge flere forskellige sorterings parametre.
Avatar billede di8leva Nybegynder
20. november 2007 - 15:41 #1
Er dette en ny måde at skrive en for-lökke? Jeg har aldrig set det tidligere:
---------------
for(LibraryResult book1: books1) {
          out.write(book1.getTitle() + "<br>");
      }
---------------

Hvad sker hvis du bruger den måden som jeg kender:

---------------
for(int i = 0; i < books1.size(); i++) {
          LibraryResult book1 = books1.get(i);
          out.write(book1.getTitle() + "<br>");
      }
---------------
Avatar billede di8leva Nybegynder
20. november 2007 - 15:44 #2
Og... har du testet sort-metoden så den faktiskt virker? Jeg syns den ser meget märkelig ud, men kan ikke rigtig se hvis den faktiskt virker eller ikke?

Förste gang du byder plads på a og b, så er ju ikke a på samme plads som tidligere, når du jämför den med b (ved ikke hvis du forstår hvad jeg mener, jeg forstår det nästen ikke selv :)  )
Avatar billede nielle Nybegynder
20. november 2007 - 16:13 #3
20/11-2007 15:41:10> Ja, det er sådan man skriver en foreach-løkke i Java. :^)
Avatar billede baitianlong Nybegynder
20. november 2007 - 18:19 #4
Jeg fiksede den ved at implementere Comparator og lave mine forskellige Comparatorer som denne:

public class LibraryListComparator_Title implements Comparator {

    public int compare(Object a, Object b) {
        LibraryResult liba = (LibraryResult)a;
        LibraryResult libb = (LibraryResult)b;
        return liba.getTitle().compareTo(libb.getTitle());
    }
}

di8leva, du skulle proeve nogen af de "nye" ting i Java version 5 som foreach og generics. Det er ganske smart ;)
Avatar billede jakoba Nybegynder
21. november 2007 - 07:51 #5
Din metode sortLibraryResultsByTitle var nok tænkt som en selectionsort, men den fejler fordi din j-forløkke starter fra 0 hvergang. Den bør starte fra i+1 så den kun leder efter 'største' blandt dem der endnu ikke er sorteret.

Derudover bliver den liste du giver som parameter ændret når du bruger den så når du bagefter udskriver books1 burde den liste også være sorteret.

Men ingen af de fejl forklarer hvorfor foreach løkken udskriver størte titel mange gange. så der er noget mere galt.

Jep, generics er seje, men de er en overbygning til basal programmering, ikke en erstatning for det.

mvh JakobA
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester