3
public class Myname {
  public static void main(String args[]){

    Letter s = new Letter(); s.setCaracter("s");
    Letter e = new Letter(); e.setCaracter("e");
    Letter a = new Letter(); a.setCaracter("a");
    Letter r = new Letter(); r.setCaracter("r");
    Letter y = new Letter(); y.setCaracter("y");
    Letter o = new Letter(); o.setCaracter("o");
    Letter u = new Letter(); u.setCaracter("u");
    Letter n = new Letter(); n.setCaracter("n");
    Letter g = new Letter(); g.setCaracter("g"); 

    Letter name[] = new Letter[10];

    name[0] = s;
    name[1] = e;
    name[2] = a;
    name[3] = r;
    name[4] = s;
    name[5] = y;
    name[6] = o;
    name[7] = u;
    name[8] = n;
    name[9] = g;


    System.out.println(nombre[0].);//HERE!

  }
}

我想知道一种在控制台中打印所有数组名称 [] 及其所有内容的方法。看到这样的东西:searsyoung

我尝试过:

System.out.println(Arrays.toString(theArray));

它打印出奇怪的东西---->[Letter_Myname.Letter@1d5550d,...

4

4 回答 4

6

迭代数组。

for(Letter l : name){
 System.out.print(l);
}

Letter实现中,您必须toString()像这样覆盖

@Override
public String toString(){
   return caracter;
}

如果您不覆盖toString,您将获得超类toString实现,然后您必须做一些像这样棘手的事情才能开始工作,但不推荐

 for(Letter l : name){
     System.out.print(l.getCaracter());
 }
于 2013-08-26T02:44:33.067 回答
3

我建议引入另一个类Word来封装更多东西。与其他方法相比,它的优势在于,当您将程序扩展到SentenceParagraph类时,它将无缝融合。

Letter[] name = new Letter[10];

// name[i] = ...

Word fname = new Word(name);
System.out.println(fname); // searsyoung

// Check the Letter class updates below
System.out.println(new Word(new Letter('J'), new Letter('o'),
                            new Letter('h'), new Letter('n'))); // John

词类

public class Word {

    private Letter[] letters;

    // makes use of var-args
    public Word(Letter... word) {
        this.letters = word;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Letter l : letters) {
            sb.append(l);
        }
        return sb.toString();
    }
}

字母类

public class Letter {

    private char c; // Prefer char over String

    public Letter(char c) {
        this.c = c;
    }

    public Letter() { // use new Letter('c') directly
    } // instead of two steps: new Letter(); setCaracter();

    public void setCaracter(char c) {
        this.c = c;
    }

    public char getCaracter() {
        return c;
    }

    @Override
    public String toString() {
        return Character.toString(c);
    }

}

从那以后,您既提供了实现,Word#toString()也提供了Letter#toString()实现;您现在可以简单地打印任何内容Word而无需循环。循环仍然会发生,但课程会自行为您完成。

于 2013-08-26T03:15:18.803 回答
2

如果您使用的是 Java 8,则可以执行以下操作:

Arrays.asList(name).forEach(System.out::print);

如果您没有覆盖该toString()方法,您可以试试这个:

Arrays.asList(name).forEach(l -> System.out.print(l.getCaracter()));
于 2013-08-26T02:48:08.917 回答
2

除了 foreach 之外,还有其他三种解决方案:

  • 循环
  • 使用迭代器
  • While 循环

使用 for 循环:

 for (int i=0;i<name.length;i++)  System.out.print(name[i]);

在这种情况下,您需要toString()在您的 Letter 类或返回值或您的字符的 getter getCaracter() 中定义。

然后它变成:

 for (int i=0;i<name.length;i++)  System.out.print(name[i].getCaracter());

两者都toString()返回getCaracter()与您的字符相同的变量,但首选 toString,因为它在您打印对象时默认调用。

另一种方法是使用 Iterator

首先,我们将nameArray 转换为 arraylist:

ArrayList<Letter> listLetters = new ArrayList<Letter>( Arrays.asList(name) );

然后我们使用 iterator() 对其进行迭代:

 Iterator itr = listLetters.iterator(); 

 while(itr.hasNext()) {

   Letter letter = itr.next(); 
   System.out.print(letter);

} 

使用 While 循环:

 int i=0;
 while (i<name.length)  {    
     System.out.print(name[i].getCaracter());
     i++;  
  }

使用 foreach 循环:

for(Letter letter : name){
 System.out.print(letter .getCaracter());
}
于 2013-08-26T02:58:52.803 回答