如何在一行中打印阵列的所有内容?

时间:2013-08-26 02:43:23

标签: java

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 个答案:

答案 0 :(得分: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());
 }

答案 1 :(得分: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

Word Class

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();
    }
}

Letter Class

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而无需循环播放。循环仍然会发生,但是类会自己为你做这件事。

答案 2 :(得分:2)

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

  • For Loop
  • 使用迭代器
  • While Loop

使用for循环:

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

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

然后它变成了:

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

toString()getCaracter()都会返回相同的变量,但首选的是toString,因为在打印对象时默认调用它。

另一种方法是使用Iterator

首先我们将name数组转换为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());
}

答案 3 :(得分:1)

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

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

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

Arrays.asList(name).forEach(l -> System.out.print(l.getCaracter()));