und deshalb programmieren wir python!

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
flying sheep
User
Beiträge: 48
Registriert: Donnerstag 17. September 2009, 16:44
Kontaktdaten:

Unkommentiert:

Code: Alles auswählen

import java.util.Arrays;
import java.util.Iterator;

public class StringUtils {
	
	/* ich will das:
	 * 
	 * def join(seq, sep, width=0):
	 *     return sep.join(str(e).rjust(width) for e in seq)
	 */
	
	//TODO: padding
	public static String join(Iterable<? extends Object> pColl, String separator, int padWidth) {
		Iterator<? extends Object> oIter;
		
		if (pColl == null || (!(oIter = pColl.iterator()).hasNext()))
			return "";
		
		StringBuilder oBuilder = new StringBuilder(String.valueOf(oIter.next()));
		while (oIter.hasNext())
			oBuilder.append(separator).append(oIter.next());
		
		return oBuilder.toString();
	}
	public static String join(Iterable<? extends Object> pColl, String separator) {
		return join(pColl, separator, 0);
	}
	
	/** Warum ist weder String iterable, noch java.text.StringCharacterIterator? */
	public static String join(String pColl, String separator, int padWidth) {
		return join(new StringCharacterIterabletor(pColl), separator, padWidth);
	}
	public static String join(String pColl, String separator) {
		return join(pColl, separator, 0);
	}
	
	/** Warum sind Arrays nicht iterable und primitive[] keine validen Argumente für Arrays.asList? */
	public static String join(Object[] pColl, String separator, int padWidth) {
		return join(Arrays.asList(pColl), separator, padWidth);
	}
	public static String join(Object[] pColl, String separator) {
		return join(pColl, separator, 0);
	}
	
	public static class StringCharacterIterabletor implements Iterator<Character>, Iterable<Character> {
		private final String string;
		private int pos = -1;
		
		public StringCharacterIterabletor(String string) {this.string = string;}
		
		@Override public boolean hasNext() {
			return this.pos < this.string.length() - 1;
		}
		@Override public Character  next() {
			return string.charAt(++this.pos);
		}
		/** Warum spezifiziert das Interface diese Methode, wenn es auch spezifiziert,
		 * dass man sie auch die Exception schmeißen lassen kann, wenn man Bock hat? */
		@Override public void remove() {
			throw new UnsupportedOperationException();
		}
		
		/** Okay, ich hab gecheated, eigentlich brauch ich noch ne Klasse… */
		@Override public Iterator<Character> iterator() {
			return this;
		}
	}
}
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
flying sheep
User
Beiträge: 48
Registriert: Donnerstag 17. September 2009, 16:44
Kontaktdaten:

Ja, eben. Strings, primitive-Arrays, Object-Arrays, Collections und Iterables müssen in Java getrennt behandelt werden, obwohl sie alle mehrere Elemente enthalten, über die man drüberloopen oder -iterieren könnte.

Ich hab nur eben mal geguckt, wie viel Code man braucht, um einen groben Designfehler in Java für eine einzige Funktion soweit auszubügeln, dass diese annähernd das „Principle of least surprise“ befolgt. Und merke: Die Funktion funzt immer noch nicht für primitive-Arrays und das rjust() ist noch nicht implementiert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Muss man ja dann M$ hoch anrechnen, dass sie C# nicht völlig kaputt konzipiert haben.

Code: Alles auswählen

using System;
using System.Text;
using System.Collections;
namespace CSharpTest
{
	static class StringExtentions {
		static public string Join(this string self, IEnumerable enumerable) {
			IEnumerator enumerator = enumerable.GetEnumerator();
			if(enumerator.MoveNext()) {
				StringBuilder builder;
				builder = new StringBuilder(enumerator.Current.ToString());
				while(enumerator.MoveNext()) {
					builder.Append(self);
					builder.Append(enumerator.Current.ToString());
				}
				return builder.ToString();
			} else {
				return "";
			}
		}
	}
	public class EntryPoint
	{
		public static void Main (string[] args) {
			System.Console.WriteLine(", ".Join("12345"));
			System.Console.WriteLine(", ".Join(new int[]{1, 2, 3, 4, 5}));
		}
	}
}
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Darii: Yeah, man kann also Datentypen ableiten, die dann anwendbar sind, ohne dass die Daten explizit in den neuen Typ umgewandelt werden müssen? Sowas fehlt mir bei Python irgendwie noch. Gilt dies dann für alles, was sich innerhalb des Namespaces befindet, oder wie läuft das ab?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

snafu hat geschrieben:@Darii: Yeah, man kann also Datentypen ableiten, die dann anwendbar sind, ohne dass die Daten explizit in den neuen Typ umgewandelt werden müssen?
Nein, das ist nur syntactic sugar zum Aufruf der statischen Methoden. Die Klasse selbst wird nicht erweitert und man kann nur aufs öffentliche Interface zugreifen.
Sowas fehlt mir bei Python irgendwie noch.
Naja in Python kann man theoretisch einfach neue Methoden direkt an die Klassen anhängen, geht nur leider bei einigen eingebauten Klassen wie string, int etc. nicht.
Gilt dies dann für alles, was sich innerhalb des Namespaces befindet, oder wie läuft das ab?
Muss vermutlich einfach im aktuellen Namensraum sichtbar sein, aber so tief stecke ich da nicht drin.
flying sheep
User
Beiträge: 48
Registriert: Donnerstag 17. September 2009, 16:44
Kontaktdaten:

scala wirkt auch ganz cool. aber solange ich keine komplexitätsberge anhäufen muss bleibt python meine erste wahl.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Darii: Ich bezog mich natürlich vorwiegend auf die eingebauten Typen. Klar, man leitet von `str` ab und baut dann zum Beispiel seine eigene split()-Methode. Trotzdem klappt die Anwendung nur, wenn die Stringklasse den zu splittenden String nochmal "umhüllt". Auf ein `"foo bar".split()` wirkt sich dies ja nicht aus.

Ist natürlich immer eine Gratwanderung hinsichtlich des Effekts, weil eher impliziter Natur. Im Prinzip wäre das sowas ähnliches wie bei den __future__-Imports. So eine Art Schnittstelle zum Verhalten des Interpreters.
Antworten