У меня есть рабочая функция аккордового переноса C #. Я пытаюсь переписать его в Java, но по какой-то причине он кажется недействительным. Может быть, лямбда не поддерживается в регулярных выражениях Java?
private String transposeChord(String ChordRegel, Integer amount)
{
String[] scale = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
java.util.Map<String, String> normalizeMap = new java.util.HashMap<>();
normalizeMap.put("Cb", "B");
normalizeMap.put("Db", "C#");
normalizeMap.put("Eb", "D#");
normalizeMap.put("Fb", "E");
normalizeMap.put("Gb", "F#");
normalizeMap.put("Ab", "G#");
normalizeMap.put("Bb", "A#");
normalizeMap.put("E#", "F");
normalizeMap.put("B#", "C");
Pattern r = Pattern.compile("[CDEFGAB](b|#)?");
Matcher match = r.matcher(ChordRegel);
return ChordRegel.replaceAll("[CDEFGAB](b|#)?", match =>
int i = (java.util.Arrays.asList(scale).indexOf(normalizeMap.containsKey(match.toString()) ? normalizeMap.get(match.toString()) : match.toString()) + amount) % scale.length;
return scale[ i < 0 ? i + scale.length : i ];)
) ;
}
Это рабочая версия C #:
private string transposeChord(string ChordRegel, int amount)
{
string[] scale = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
string[] scale2 = { "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B" };
var normalizeMap = new Dictionary<string, string>() { { "Cb", "B" }, { "Db", "C#" }, { "Eb", "D#" }, { "Fb", "E" }, { "Gb", "F#" }, { "Ab", "G#" }, { "Bb", "A#" }, { "E#", "F" }, { "B#", "C" } };
var normalizeMap2 = new Dictionary<string, string>() { { "C#", "Db" }, { "D#", "Eb" }, { "E#", "F" }, { "F#", "Gb" }, { "G#", "Ab" }, { "A#", "Bb" }, { "B#", "C" }, { "Fb", "E" } };
return new Regex("[CDEFGAB](b|#)?").Replace(ChordRegel, match =>
{
int i = 0; string NewKey = "";
if (Mollen.Checked == true)
{
i = (Array.IndexOf(scale2, normalizeMap2.ContainsKey(match.Value) ? normalizeMap2[match.Value] : match.Value) + amount) % scale2.Length;
NewKey = scale2[i < 0 ? i + scale2.Length : i];
}
else
{
i = (Array.IndexOf(scale, normalizeMap.ContainsKey(match.Value) ? normalizeMap[match.Value] : match.Value) + amount) % scale.Length;
NewKey = scale[i < 0 ? i + scale.Length : i];
}
return NewKey;
});
}