【问题标题】:Java, handling variable arguments and referring to object created basing on them (?)Java,处理变量参数并引用基于它们创建的对象(?)
【发布时间】:2015-11-04 02:27:04
【问题描述】:

这将是我在这里的第一个问题,我经常使用网站,但我第一次没有找到答案。我尝试将网上找到的一些代码移植到 java,最初是用 python 编写的,这是我第一次使用那些带有可变参数的“花哨”循环和函数,所以我遇到了一些与这些主题相关的问题。
我也知道标题不好的问题,但我真的不知道如何命名它。

我有这样的课:

public class Keyboard {
Keyboard(String... rows){
    double y=0;
    for(String row : rows){
        double x=0;
        /** For-each loop is applicable for arrays and Iterable.  
           * String is not an array. It holds array of characters but it is not an array itself. 
            *String does not implement interface Iterable too.
            *If you want to use for-each loop for iteration over characters into the string you have to say:
            */
        for(char letter : row.toCharArray()){                
            if(letter!=' '){
                letter : new Point2D.Double(x,y);
                letter : System.out.println("Punkt " + letter + "   x: " + x + "   y: " + y);
                //to print it out like in python sauce, i guess I would have to overwrite tostring() 
            }
            x+=0.5;
        }  
        y++;
     }
}

然后像这样主要:

public class test {
public static void main(String[] args){
Keyboard qwerty = new Keyboard("Q W E R T Y U I O P",
                               " A S D F G H J K L ",
                               "   Z X C V B N M   ");
Point W = qwerty['W']; //this line is wrong
}

我知道键盘在这种情况下需要 3 个字符串作为参数,依此类推,但我不知道如何,嗯,从键盘中创建的特定字母引用。

【问题讨论】:

    标签: java loops foreach


    【解决方案1】:

    您不能这样做 qwerty['W'] 因为 qwerty 不是数组,Java 只允许对实际数组进行数组索引。没有与 Python 的 __getitem__ 方法等效的 Java,因此您不能使其他类支持类似数组的访问。您需要编写一个普通的方法来进行查找。

    就可变参数(String... rows)而言,这只是传递数组的一种奇特方式。当您调用 Keyboard 构造函数时,您可以在括号中写入多个字符串,它们会自动组成一个数组。在Keyboard 构造函数的实现中,它与参数为String[] rows 相同。

    不完全清楚 Keyboard 构造函数应该做什么,但如果您的目标是能够查找字母键的坐标,那么最简单的方法是在类:

    public class Keyboard {
      // ...
      private final Map<Character, Point> keyPositions = new HashMap<>();
      // ...
    }
    

    然后,在构造函数中,您可以使用每个字母的条目来填充它:

    for (char letter : row.toCharArray()) {
      // ...
      keyPositions.put(letter, new Point2D.Double(x, y));
      // ...
    }
    

    您查找字母位置的函数可以从数组中获取条目:

    public Point getPosition(char letter) {
      return keyPositions.get(letter);
    }
    

    你应该写qwerty.getPosition('W')而不是qwerty['W']

    【讨论】:

    • 此外,OP 正在将单个字符串文字传递给 Keyboard 构造函数,我认为 OP 意味着传入一个数组,每个字母作为一个单独的元素。您的回答没有涵盖那部分,我认为这可能是相关的。
    • OP 将 three 字符串字面量传递给构造函数,表示键盘上的三行字母,构造函数调用参数rows 并在字符串。所以我认为这是故意的。
    • 我只是对letter :作为标签的出现感到困惑,以及分配新的点对象而不将其分配给变量。
    • 哦,对了,该死的懒惰的眼睛。是的,我自己对letter : 感到困惑。
    • 我不确定这是否适合我回复。我不知道 hasmap 之类的东西,这在那种情况下非常有用。你完全理解我的问题,帮了我很多,现在我可以很容易地计算出字母的距离等等,f.e. System.out.println(qwerty.getPosition('W').distance(qwerty.getPosition('F'))); 另外,我仍然不完全理解那个“字母:”的用法,所以这就是你们困惑的原因。关于:分配新的点对象而不将其分配给变量,您的确切含义是什么,我该怎么办? @Wyzard
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多