Sortierreihenfolge festlegen im ArrayList

chriss_2oo4

Erfahrenes Mitglied
Hi,

ich habe ein Problem mit der Implementierung einer Sortierreihenfolge und zwar möchte ich das das Zeichen * die niedrigste Priorität bekommt wie im folgenden Beispiel:

DU BIST EIN ROBOTER
DU BIST JA LUSTIG
DU BIST JA *
DU BIST *
DU LUEGST
DU *
HALLO
*

Das * muss immer zuletzt kommen und "Du bist ja *" muss vor "Du bist *" kommen.

Bisher habe ich keinen passenden Ansatz gefunden dieses Problem zu lösen.


lg Chriss
 
Hi,

erstmal danke für die schnelle Antwort!

Das mit der Comperator-Klasse hab ich bereits versucht, leider bekomm ich die Implementierung nicht so hin, dass die Liste wie im obigen Beispiel sortiert.

Lg Chriss
 
Hallo,

dann liegt es aber an der Implementation deines Comparators. Vielleicht solltest du dazu mal deinen SourceCode posten.

MFG

Sascha
 
Frei-Kopf Lösung. Vollständigkeit oder Fehlerfreiheit wird nicht garantiert.

Java:
StringByStarComparator implements java.util.Comparator<String> {
	int compare(String left, String right) {
		int result = 0;

		if(left.contains("*") || right.contains("*")) {
			int curPosition = 0;

			for(curPosition < left.length && curPosition < right.length) {
				result = left.charAt(curPosition) - right.chatAt(curPosition);

				if(0 != result || '*' == left.charAt(curPosition)) {
					result = 1;
					break;
				}

				if(0 != result || '*' == right.charAt(curPosition)) {
					result = -1;
					break;
				}

				curPosition++;
			}

			if(0 == result) {
				result = left.length - right.length;
			}
		}
		else {
			result = left.compare(right);
		}

		return result;
	}
}
 
Versuch es mal hiermit. Sortiert nach dem Alphabet, wobei * immer größer gewertet wird (an letzte Stelle gerückt wird). Hab es aber noch nicht getestet.

Code:
public int compare(Object o1, Object o2)
  {
       
    String s1 = o1.toString();
    String s2 = o2.toString();
    
    if (s1.intern() == s2)
    {
      return 0;
    }
    else
    {
      char a, b;
      for (int i = 0, n = Math.min(s1.length(), s2.length()); i < n; i++)
      {
        a = s1.charAt(i);
        b = s2.charAt(i);
        if (a != b)
        {
          else if (b == '*')
          {
            return 1;
          }
          else if (a < b)
          {
            return -1;
          }

          else
          {
            return 1;
          }
        }
      }
      return 0;
    }
    
  }
 
Hallo,
Mal so als zusätzlichen Hinweis unabhängig der Sternchenregel...
Falls Du Chriss_2004 eine litterarisch korrekte Sortierung haben möchtest, die vor allem Sonderzeichen wie z.B. Umlaute und Spezialitäten anderer Sprachen einbezieht, verwende die Klasse Collator, die Du im Package java.text findest.

viel Spaß

Takidoso
 
Ohh, so viele Antworten -> Vielen Dank!

Ich hab jetzt mal versucht die impelmentierung von Sascha Schirra zu verwenden -> so wie sie da steht hat sie nicht funktionier, hab sie etwas ungeändert und jetzt liefert sie mir das richtige Ergebnis falschherum sortiert.

Außerdem hab ich den Teil in der for-Schleife nicht 100%ig verstanden, wäre nett wenn Du noch n paar Worte dazu sagen könntest.


Achja, mein Code:

Code:
public int compare(Object o1, Object o2)
	{
		int iRet = 0;
		
		
	    String s1 = o1.getText();
	    String s2 = o2.getText();

	    
	    if (s1.intern() == s2)
	    {
	      iRet = 0;
	    }
	    else
	    {
	      char a, b;
	      for (int i = 0, n = Math.min(s1.length(), s2.length()); i < n; i++)
	      {
	        a = s1.charAt(i);
	        b = s2.charAt(i);
	        if (a != b)
	        {
		        if (b == '*')
		        {
		          iRet = 1;
		          break;
		        }
		        else if (a < b)
		        {
		          iRet = -1;
		          break;
		        }
		        else
		        {
		          iRet = 1;
		          break;
		        }
	        }
	      }
	    }
	    return iRet;
	  }

Schönen rest-abend noch!
Chriss
 
Achja, mein Code:

Java:
public int compare(Object o1, Object o2)
	{
		int iRet = 0;
		
		
	    String s1 = o1.getText();
	    String s2 = o2.getText();

	    
	    if (s1.intern() == s2)
	    {
	      iRet = 0;
	    }
	    else
	    {
	      char a, b;
	      for (int i = 0, n = Math.min(s1.length(), s2.length()); i < n; i++)
	      {
	        a = s1.charAt(i);
	        b = s2.charAt(i);
	        if (a != b)
	        {
		        if (b == '*')
		        {
		          iRet = 1;
		          break;
		        }
		        else if (a < b)
		        {
		          iRet = -1;
		          break;
		        }
		        else
		        {
		          iRet = 1;
		          break;
		        }
	        }
	      }
	    }
	    return iRet;
	  }

Schönen rest-abend noch!
Chriss

Er iteriert über beide Strings, wobei er maximal so oft iteriert, wie der kürzere String lang ist.
Von beiden Strings werden die Zeichen an der aktuellen Position genommen und miteinander verglichen. Wenn sie nicht gleich sind wird überprüft ob b ein * ist, falls dies nicht der Fall wird überprüft ob das Zeichen vom s1 String kleiner als das vom s2 String ist. Im * Fall und im "Zeichen von s1 ist grösser als Zeichen von s2" wird -1 zurückgegeben (s1 < s2), ansonsten 1 (s1 > s2).

Der Code überprüft nicht ob die Strings unterschiedlich lang sind.
 
Ok,

wenn -1 zurückgegeben wird dann ist der erste String in der Liste weiter oben und wenn 1 zurückgegeben wird dann weiter unten?

Lg chriss
 
Zurück