据我所知,Android中的字符串数组不是动态的。至少根据我在这个网站上被告知的内容。我不能只创建一个字符串数组,然后随时添加任意数量的项目。为了解决这个问题,你需要一个ListArray,然后在完成数组后将其转换为String数组。如果我对此有误,那么你可以通过告诉我如何创建动态String数组来回答这个问题,例如:
String[] menuList = new String[];
menuList.add("One");
menuList.add("A");
String firstItem = menuList[0];
menuList.add("Two");
注意我可以从中拉出然后添加到它,而无需采取任何额外的步骤或转换。
假设上述情况不可行,我试图根据在线文本文件中的数据设置数组。到目前为止一切都很好,每次他们访问此文本文件时,应用程序都会在应用程序中本地保存文本文件。还好。但是,如果没有Internet访问,我希望String数组基于保存的本地文本文件。问题是我相信我需要声明字符串数组在创建时的长度,如果我在if语句中创建它,则应用程序的其余部分将无法识别它。像这样:
ListArray<String> menuList = getFile(filename);
//The above line populates the ListArray with the online file, and returns an empty ListArray if there is no internet connection or if there is some problem with getting the file.
//Now I want to populate a String[] with the ListArray if it was successful (and overwrite the local copy), or if it was unsuccessful, I want to get the local copy and populate it with that.
if(menuList.size != 0){
writeToFile("Menu List", menuList);
String[] menuArray = menuList.toArray(new String[menuList.size()]);
} else {
String[] menuArray = readFromFile("Menu List");
}
setUpView(menuArray);
现在显然这不起作用,因为setUpView无法看到menuArray是在if语句中创建的。我怎样才能使用String数组(而不是简单地使用ListArray)而使用if语句来确定其内容?
我应该提一下,既然现在我已经写出了问题,我已经看到了几个问题。例如,我可以简单地组合write和read方法,然后我不需要在这里使用if语句。或者我可以使用ListArray直到最后一分钟,或者将String []设置为远远超过我需要它并且当它到达空槽时停止拉动它。也就是说,在if语句中使用String []之前已经出现了,如果可能的话,我想知道如何实现这样的事情。想法?
答案 0 :(得分:1)
您需要在if
语句之外声明变量,然后将其分配到内部。
String[] menuArray;
if(menuList.size != 0){
writeToFile("Menu List", menuList);
menuArray = menuList.toArray(new String[menuList.size()]);
} else {
menuArray = readFromFile("Menu List");
}
答案 1 :(得分:1)
我不能只创建一个字符串数组,然后添加任意数量的项目 无论什么时候我都喜欢它。为了解决这个问题,你做一个ListArray和 完成数组后,将其转换为String数组。如果 我被误导了,然后你可以回答这个问题 告诉我如何创建动态String数组。
在我看来,使用静态数组实现效率不高,因为当你调整它的大小(arrayList)时,实际发生的是在主内存中放置两倍大小,然后遍历数组并更新第二个数组。第一个收集了垃圾。有为动态列表提供的java实现,为什么不使用它们?
示例:请参阅LinkedList
我不能只创建一个字符串数组,然后添加任意数量的项目 无论什么时候我都喜欢它。为了解决这个问题,你做一个ListArray和 然后在完成数组后将其转换为String数组。
你不需要创建自己的动态列表(因为有java实现),但是,我将解释它们是如何工作的,所以你可以对它有所了解。动态列表是通过保存下一个节点的指针的类节点实现的,因此所有这些都构成了连接项的列表。此外,列表的第一个元素标记为列表的头部,最后一个元素标记为尾部(如果使用java的LinkedList,则有双指针;保留上一个节点和下一个节点,以便在需要时可以向后移动)。动态列表和数组之间的区别在于,您没有为它声明大小,而是根据需要添加任意数量的项目,并仅分配主内存中这些节点的大小。另一方面,静态数组需要为整个大小分配内存,尽管你有空的indeces。此外,节点不是按顺序存储在主存储器中,静态数组就是这种情况,因为在访问索引时可以实现时间复杂度O(1)。
这是如何工作的一个例子:
public class Node {
private Object item;
private Node next;
public Node() {
next = null;
}
public Node(Object newItem) {
item = newItem;
next = null;
}
public Node(Object newItem, Node nextNode) {
item = newItem;
next = nextNode;
}
public void setItem(Object newItem) {
item = newItem;
}
public Object getItem() {
return item;
}
public void setNext(ListNode nextNode) {
next = nextNode;
}
public Node getNext() {
return next;
}
}
public class LinkedList {
private Node head;
private Node tail;
int numItems;
public LinkedList() {
head = tail = null;
numItems = 0;
}
public int size() {
return numItems;
}
public boolean isEmpty() {
return (numItems == 0);
}
public void removeAll() {
head = tail = null;
numItems = 0;
}
private Node find(int index) {
ListNode curr = head;
for (int skip = 1; skip < index; skip++)
curr = curr.getNext();
return curr;
}
// Etc for the other methods.. like add/remove/etc
}
上面的示例并不是最好的例子。我只是提供 为了理解目的,还有其他可能的事情 使用,例如二进制搜索树或hashMap。该 平衡二叉搜索树的算法复杂度为O(log n) 而hashMap具有从O(1)到O(n)的算法复杂度(更多 经常是O(1))
答案 2 :(得分:1)
我引用SLaks's answer,我想在此添加您的评论的答案,因为我还没有足够的声誉。您“不需要在声明中设置长度”。这条线
String[] menuArray;
实际上只声明对数组对象的引用,它不会创建对象本身,它不会为数组分配内存(除了堆栈上引用的小位)。请记住在访问变量之前初始化变量。
那就是说,如果您正在寻找“可扩展”数组,那么您应该使用ArrayList
和List
接口。 ArrayList
,而不是ListArray,是来自Java官方文档的“List接口的可调整大小的数组实现”。
您是否可以将方法setUpView
更改为List
?如果没有,你仍然可以使用:
List<String> menuList;
// ...
String[] arr = (String[]) menuList.toArray();
List<String> list = new ArrayList<String>(Arrays.asList(arr));