Ich habe diese Akkordlinie aus Textdatei erhalten. Zum BeispielWie ersetze ich mehrere Teilstrings durch verschiedene Teilstrings?
String chordLine = "C G Am C";
String transposedChordLine;
Als nächstes muss ich unter Verwendung von zwei Parametern, ein String
Akkord und integer Zuwachs von transponieren die chordLine
in eine neue transposedChordLine
mit der Klasse transponieren. Zum Beispiel gibt transpose("C", 2)
zurück.
public class Transposer{
private int inc;
private static ArrayList<String> keysSharp;
private static ArrayList<String> keysFlat;
Transposer(){
keysSharp = new ArrayList<String>(Arrays.asList("C", "C#", "D", "D#","E", "F","F#", "G","G#", "A","A#", "B"));
keysFlat = new ArrayList<String>(Arrays.asList("C", "Db", "D", "Eb","E", "F","Gb", "G","Ab", "A","Bb", "B"));
}
public String transpose(String chord,int inc){
this.inc = inc;
String newChord;
if(chord.contains("/")){
String[] split = chord.split("/");
newChord = transposeKey(split[0]) + "/" + transposeKey(split[1]);
}else
newChord = transposeKey(chord);
return newChord;
}
private String transposeKey(String key){ // C#m/D# must pass C#m or D#
String nKey, tempKey;
if(key.length()>1){
nKey = key.substring(0, 2);
}
else{ nKey = key; }
int oldIndex, newIndex;
if(key.contains("b")){
oldIndex = (keysFlat.indexOf(nKey)>-1) ? keysFlat.indexOf(nKey) : keysFlat.indexOf(similarKey(nKey));
newIndex = (oldIndex + inc + keysFlat.size())%keysFlat.size();
tempKey = keysFlat.get(newIndex);
nKey = (key.length() < 3) ? tempKey : key.replace(nKey, tempKey);
//(nKey + key.substring(nKey.length(), key.length()));
}
else if(key.contains("#")){
oldIndex = (keysSharp.indexOf(nKey)>-1) ? keysSharp.indexOf(nKey) : keysSharp.indexOf(similarKey(nKey));
newIndex = (oldIndex + inc + keysSharp.size())%keysSharp.size();
tempKey = keysSharp.get(newIndex);
nKey = (key.length() < 3) ? tempKey : key.replace(nKey, tempKey);
}
else{
nKey = nKey.substring(0, 1);
oldIndex = (keysSharp.indexOf(nKey)>-1) ? keysSharp.indexOf(nKey) : keysSharp.indexOf(similarKey(nKey));
newIndex = (oldIndex + inc + keysSharp.size())%keysSharp.size();
tempKey = keysSharp.get(newIndex);
nKey = (key.length() < 2) ? tempKey : key.replace(nKey, tempKey);
}
return nKey;
}
private String similarKey(String nKey) {
String newKey;
switch(nKey){
case "Cb":
newKey = "B";
break;
case "Fb":
newKey = "E";
break;
case "E#":
newKey = "F";
break;
case "B#":
newKey = "c";
break;
default:
newKey = null;
}
return newKey;
}
}
Wie ersetze ich die chordLine
ohne die Leerzeichen zu verlieren? Zuwachs von 2 sollte transposedChordLine="D A Bm D"
Hier mein aktueller Versuch ist:
public static void main(String[] args) {
String chordLine = "C G Am C";
String transposedChordLine;
String normalize = chordLine.replaceAll("\\s+", " ");
String[] split = normalize.split(" ");
//System.out.println(normalize);
Transposer tran = new Transposer();
String[] temp = new String[split.length];
for(int i=0 ; i<split.length ; i++){
temp[i] = tran.transpose(split[i], 2);
//System.out.println(split[i]);
System.out.print(temp[i]);
}
transposedChordLine = chordLine.replaceAll([split], temp); //which is wrong
}
Viele mögliche Lösungen. Zum Beispiel: Erstellen Sie ein Objekt, 'ChordLine', das eine einzelne Akkordlinie einspielt. In diesem Konstruktor des Objekts können Sie explizit die Menge an Leerzeichen zwischen den Akkorden 'n_i' und' n_i + 1' verfolgen. Dann können Sie beim Transponieren einfach den Leerraum im Ausgang 'ChordLine' ersetzen. – Kon
Entschuldigung, es geht nicht um Ihre Frage, aber Ihr Code ist wirklich schlecht. Initialisieren Sie nicht 'statische' Member im Konstruktor. Ändern Sie die beiden Statiken in 'List' und initialisieren Sie diese direkt mit 'Arrays.asList'. Verwenden Sie keine Instanzfelder, um Parameter an private Methoden zu übergeben. Wenn "inc" bei Aufrufen von "transpose" unterschiedlich sein kann, dann übergeben Sie es als Parameter an die privaten Methoden. Wenn "inc" immer gleich ist, übergeben Sie es an den Konstruktor und nicht an die transpose-Methode. –
Andreas
Ich habe gerade vor etwa einem Jahr mit Java angefangen. Danke für den Kommentar. – Tuss