2014-10-03 157 views
1

所以我需要打印出整数数组。问题是,当用户输入要处理和排序的数字时,我不知道用户输入了多少个数字。唯一的规则是用户只能输入少于10000个数字。如何打印数组的使用与Array.toString()所有非空元素

所以我做了能容纳10000个的数字,但如果用户输入小于10000号到数组,然后Array.toString()功能打印出的一切,甚至是空的空间阵列。

有没有办法绕过这还是有什么其他的方法,用于输出在一行中的数组,将格式化输出看起来像这样:[1, 2, 3, 4, 5, 6]

非常感谢!

+1

怎么样使用ArrayList的''? – 2014-10-03 13:43:35

+2

使用列表而非数组。然后,如果你真的需要(但你不应该)将它转换回数组。你可以很容易地遍历列表,它有一个动态的长度。 – 2014-10-03 13:44:04

回答

2

ArrayList<T>(仿制药可选<T>)。如果有更多输入可用,则是一个动态增加更多内存的数组。将元素添加到此列表的分摊成本为O(1),但它提供了处理输入的便捷方法。

要回答你的问题,因为@Mureinik已经回答了你,然后可以使用ArrayList.toString()到列表转换为文本表示。

要回答你的真正的问题,您可以执行以下操作:

public static<T> String toStringArrayNonNulls (T[] data) { 
    StringBuilder sb = new StringBuilder(); 
    sb.append("["); 
    int n = data.length; 
    int i = 0; 
    for(; i < n; i++) { 
     if(data[i] != null) { 
      sb.append(data[i].toString()); 
      break; 
     } 
    } 
    for(; i < n; i++) { 
     if(data[i] != null) { 
      sb.append(","); 
      sb.append(data[i].toString()); 
     } 
    } 
    sb.append("]"); 
    return sb.toString(); 
} 

,并调用该方法你想要的任何类型的数组。

例子

String[] names = new String[] {"Alice",null,"Charly","David",null,null}; 
System.out.println(toStringArrayNonNulls(names)); 
Integer[] primes = new Integer[] {2,3,null,null,11}; 
System.out.println(toStringArrayNonNulls(primes)); 
Object[] namesAndPrimes = new Integer[] {"Alice",2,null,3,null,"Charly",null,11}; 
System.out.println(toStringArrayNonNulls(namesAndPrimes)); 
+0

谢谢!我猜是时候习惯ArrayLists了。 – Artur 2014-10-03 13:52:12

+0

刚刚尝试过toStringArrayNonNulls方法,它仍然打印整个数组并在其中添加一个额外的数字。试图找出原因,但没有线索。例如,如果我有三个相同大小的数组,我将它们的第一个元素添加到一起并除以3,然后将其作为所有元素并将其存储到要打印出来的最终整数数组中。如果我将所有数组设置为“整数”,它将发出NullPointerException异常,但如果只有最后一个数组,则它将输出数组中的每个元素。不知道什么是错的。 – Artur 2014-10-03 15:29:57

4

将用户的输入存储在ArrayList中,然后仅打印myArryList.toString()会容易得多。

+1

好吧,没想到ArrayLists,谢谢! – Artur 2014-10-03 13:47:29

+1

@Artur:那么对于大多数应用,阵列等级太低(尤其是因为*的Java *有一些麻烦与原始类型)。只有当你的应用程序应该得到最大的出CPU中,应该使用数组... – 2014-10-03 13:52:30

2

如果你想在Java中的动态数组,最好的办法就是学习如何使用清单:

List<Integer> integers = new ArrayList<Integer>(); 

为你把它只会打印尽可能多的数字。

如果你不想重写你的程序,这也是解决方案:

Integer[]x = new Integer[50]; 
    List<Integer> integers = new ArrayList<Integer>();   
    integers = new ArrayList<Integer>(Arrays.asList(x)); 
+0

解决方案是好的,只是想补充一点,一个LinkedList可能会更好,如果你只存储10000个整数时,有插入和循环操作,性能明智。 – Pienterekaak 2014-10-03 14:12:07

+0

@Penterekakaak:嗯加一个元素的摊余成本仍然* O(1)*,所以在大的来说的哦,没有什么区别。我同意在某些情况下它很重要。 – 2014-10-03 14:40:34