java - 如何在 Processing 中允许可编程键输入?

标签 java arrays if-statement switch-statement processing

我正在编写一个处理脚本,想要检测一个键(使用 key 变量)是否是用户提前选择的一组键中的一个(例如,在设置 JSON 中文件或其他一些方法)。我使用 switch/case 语句来设置它,但事实证明我不能将变量用作 case 表达式。

我使用了 final 关键字将它们标记为常量,这适用于定义为直接变量的那些,但不适用于存储在数组中的那些。

有没有一种方法可以避免使用长的 if/elseif 语句或将数组拆分为多个变量?

如果不清楚(双关语不是故意的),这是我当前的代码:

// constants
final char[] teamHotkeys  = {'b', 'y', 'p', 'o', 'r'};

final char animationHotkey = ' ';
final char doAllHotkey = 'a';

...

// keyPressed handler
void keyPressed(){
 float[] chartArea = {gridSizeHeight * 2, gridSizeHeight * 22, gridSizeWidth * 1, gridSizeWidth * 23};
 // check which key has been pressed
 switch (key){
   case teamHotkeys[0]:
     drawBar(0, chartArea);
     break;
   case teamHotkeys[1]:
     drawBar(1, chartArea);
     break;
   case teamHotkeys[2]:
     drawBar(2, chartArea);
     break;
   case teamHotkeys[3]:
     drawBar(3, chartArea);
     break;
   case teamHotkeys[4]:
     drawBar(4, chartArea);
     break;
   case animationHotkey:
     runAnimation();
     break;
   case doAllHotkey:
     showFinalScores();
     break;
 }
}

编译器可以正常访问 animationHotkeydoAllHotkey,现在它们是常量,但它不能访问 teamHotkeys[] 的索引因为只有数组是常量,但它的成员在技术上可能已经改变,但编译器不知道它们永远不会改变。

最佳答案

我只会使用 if 语句。有时最愚蠢的代码是最好的。它是最容易理解的,一旦编写完成,您就可以将它放在函数中的某个地方,而不是真正地看太多。

但是如果您真的想避免 if 语句,您可以采取的一种方法是创建一个 HashMap 将字符键映射到可运行的操作。这是一个非常基本的示例:

HashMap<Character, Runnable> keyRunnableMap = new HashMap<Character, Runnable>();

void setup() {
  Runnable aRunnable = new Runnable() {
    public void run() {
      println("A pressed.");
    }
  };

  Runnable bRunnable = new Runnable() {
    public void run() {
      println("B pressed.");
    }
  };

  keyRunnableMap.put('a', aRunnable);
  keyRunnableMap.put('b', bRunnable);
}

void draw() {
}

void keyPressed() {
  if (keyRunnableMap.containsKey(key)) {
    keyRunnableMap.get(key).run();
  }
}

这可以让您的 keyPressed() 逻辑非常简短,但是需要更多的代码来设置。您可以使用 Java 8 lambda 将其缩短一点,但如果您使用的是当前版本的 Processing 编辑器,那将不起作用。我实际上并不推荐这种方法。坚持使用 if 语句。

编辑:您还可以依赖这样一个事实,即在幕后,key 变量是一个 char 类型,它实际上是一个数字。小写的 'a' 是数字 97。更多信息 here .这是一个例子:

Runnable[] runnableArray = new Runnable[2];

void setup() {
  Runnable aRunnable = new Runnable() {
    public void run() {
      println("A pressed.");
    }
  };

  Runnable bRunnable = new Runnable() {
    public void run() {
      println("B pressed.");
    }
  };

  runnableArray[0] = aRunnable;
  runnableArray[1] = bRunnable;
}

void draw() {
}

void keyPressed() {

  // a = 97, b = 98
  if(key >= 'a' && key <= 'b'){
    int index = key - 97;
    runnableArray[index].run();
  }
}

同样,我实际上并不推荐这种方法,因为它的可读性并不比 if 语句高。

关于java - 如何在 Processing 中允许可编程键输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46833845/

相关文章:

javascript - JavaScript 中三元运算符如何比较字符和数字?

C++ cout 多次打印出相同的字符串

java - Android ByteBuffer 到 float 转换返回错误值

java - 在适用于 Android 的 OpenGL ES 中使用 2D 游戏渲染图像

java - 嘿,我有一个关于 Spring 中的依赖注入(inject)和 bean 实例化的问题

c# - 如何在循环外访问字符串数组

java - 正则表达式静态组问题

php - 将显示一行的 wpdb 查询结果转换为单个变量(如果重要,请使用短代码)

java - 我如何改变这个贪心算法来预测最全面的分数?

pandas - 基于 python 中其他列的值的新列