c enum能像java一样吗_Java枚举替代我如何做到这一点?

通过编码MIDI处理程序来自学Java.程序需要做的一件事是在MIDI音符编号及其对应的紧凑字符串表示形式之间来回转换.我看过使用枚举设置,但是由于命名限制,您无法执行类似的操作

c-1, c#-1, ... g9;

因为尖锐和负面(是的,我遵循的惯例是使您最终得到负八度音:P).

必须在允许的范围和我想要的范围之间进行转换似乎很笨拙.

CNEG1("c-1"),

CSNEG1("c#-1"),

DNEG1("d-1"),

...

G9("g9");

所以我想出了下面的静态导入方案,它可以正常工作.但是,我想了解有关如何使用枚举的更多信息,并且我有直觉,如果实际上我更好地了解枚举的含义,它们实际上可能会更适合该任务.所以这就是我的问题:任何人都可以提出一种优雅的方法来使用枚举方案提供相同的功能吗?此外,会否有强烈的理由这样做?

public abstract class MethodsAndConstants {

public static final String TONICS[] = {"c","c#","d","d#","e","f","f#","g","g#","a","a#","b"};

static final NoteMap notemap = new NoteMap();

static class NoteMap{

static String map[] = new String[128];

NoteMap() {

for (int i = 0; i < 128; i++){

int octave = i/12 - 1;

String tonic = MethodsAndConstants.TONICS[i%12];

map[i] = tonic + octave;

}

}

}

public static int convert_midi_note(String name){

return indexOf(NoteMap.map, name);

}

public static String convert_midi_note(int note_num){

return NoteMap.map[note_num];

}

public static int indexOf(String[] a, String item){

return java.util.Arrays.asList(a).indexOf(item);

}

}

编辑——————————————

经过深思熟虑,我认为在这种特殊情况下,枚举毕竟可能会过大.我可能最终只是在这里使用此代码,这是一种静态导入方法,但甚至不再需要上面的NoteMap业务.

note_num->名称转换非常简单,名称-> note_num的东西只是很好的字符串解析乐趣.

public abstract class MethodsAndConstants {

public static final String[] TONICS = {"c","c#","d","d#","e","f","f#","g","g#","a","a#","b"};

static String convert(int i) {

String tonic = MethodsAndConstants.TONICS[i%12];

int octave = (i / 12) - 1;

return tonic + octave;

}

static int convert(String s) {

int tonic = java.util.Arrays.asList(MethodsAndConstants.TONICS).indexOf(s.substring(0,1));

if (s.contains("#")) tonic += 1;

int octave = Integer.parseInt(s.substring(s.length()-1));

if (s.contains("-")) octave -= 2; // case octave = -1

int note_num = ((octave + 1) * 12) + tonic;

return note_num;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值