首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >If语句中的Android字符串数组

If语句中的Android字符串数组
EN

Stack Overflow用户
提问于 2014-01-13 16:56:09
回答 3查看 2.5K关注 0票数 3

据我所知,Android中的字符串数组不是动态的。至少根据我在这个网站上得到的信息。我不能只是创建一个字符串数组,然后在我想要的时候向它添加尽可能多的项目。为了解决这个问题,您执行一个ListArray,然后在完成该数组后将其转换为一个字符串数组。如果我被误导了,那么您可以通过告诉我如何创建一个动态字符串数组来回答这个问题,例如:

代码语言:javascript
运行
复制
String[] menuList = new String[];
menuList.add("One");
menuList.add("A");
String firstItem = menuList[0];
menuList.add("Two");

请注意,我可以从它中提取,然后添加到它,而不必采取任何额外的步骤或转换。

假设上述情况不可能实现,我将尝试根据联机文本文件中的数据设置数组。到目前为止还不错,每次他们访问这个文本文件时,应用程序都会将文本文件保存在应用程序中。还是很好。但是,如果没有internet访问,我希望字符串数组基于保存的本地文本文件。问题是,我认为我需要在创建字符串数组时声明它的长度,如果我在if语句中创建它,则应用程序的其余部分将无法识别它。如下所示:

代码语言:javascript
运行
复制
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语句中创建的。在使用if语句确定其内容时,如何使用String数组(而不是简单地使用ListArray )?

我应该提一提,既然我已经把问题写出来了,我已经看到了好几个工作。例如,我可以简单地组合写和读方法,然后我就不需要在这里使用if语句了。或者,我可以使用ListArray直到最后一分钟,或者将String[]设置为比我需要的时间长得多,并且当它到达空槽时停止从它中提取。尽管如此,在if语句中使用String[]之前已经出现过,如果可能的话,我想知道如何实现这样的事情。有什么想法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-13 16:57:52

您需要在if语句之外声明变量,然后在其中分配它。

代码语言:javascript
运行
复制
String[] menuArray;
if(menuList.size != 0){
   writeToFile("Menu List", menuList);
   menuArray = menuList.toArray(new String[menuList.size()]);
} else {
   menuArray = readFromFile("Menu List");
}
票数 1
EN

Stack Overflow用户

发布于 2014-01-13 17:31:34

我不能只是创建一个字符串数组,然后在我想要的时候向它添加尽可能多的项目。为了解决这个问题,您执行一个ListArray,然后在完成该数组后将其转换为一个字符串数组。如果我被误导了,那么您可以通过告诉我如何创建动态字符串数组来回答这个问题。

在我看来,使用静态数组实现并不有效,因为当您调整它的大小( arrayList)时,实际发生的情况是将内存的大小提高一倍,然后遍历该数组并更新第二个内存。第一种是收集碳水化合物。有为动态列表提供的java实现,为什么不使用它们?

示例:参见LinkedList

我不能只是创建一个字符串数组,然后在我想要的时候向它添加尽可能多的项目。为了解决这个问题,您执行一个ListArray,然后在完成该数组后将其转换为一个字符串数组。

您不需要创建自己的动态列表(因为有java实现),但是,我将解释它们是如何工作的,这样您就可以了解它了。动态列表是用一个类节点实现的,该类节点保留下一个节点的指针,因此所有这些都形成了一个连接项的列表。此外,列表的第一个元素被标记为列表的头元素,最后一个元素标记为尾元素(如果使用java的LinkedList,则有两个指针;保留前一个和下一个节点,以便在需要时可以向后移动)。动态列表和数组之间的区别在于,您没有为它声明大小,而是根据需要添加多少项,并且只在主内存中分配这些节点的大小。另一方面,静态数组需要释放内存的整个大小,即使您有空的监听器。此外,节点不是顺序地存储在主内存中,这是静态数组的情况,因为就像这样,在访问索引时可以实现复杂度O(1)。

这是一个如何工作的例子:

代码语言:javascript
运行
复制
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 ),而hashMap的算法复杂度从O(1)到O(n) (更常见的是O(1))。

票数 1
EN

Stack Overflow用户

发布于 2014-01-13 17:58:42

我引用SLaks的回答的话,我想在这里补充你的评论,因为我还没有足够的声誉。您“不需要在声明中设置长度”。线

String[] menuArray;

实际上,它只声明对数组对象的引用,它不创建对象本身,也不为数组分配内存(堆栈上引用的微小位除外)。但是,请记住在访问变量之前初始化它。

尽管如此,我认为如果您正在寻找一个“可扩展”数组,那么您应该使用ArrayListList接口。ArrayList而不是ListArray是来自Java官方文档的“列表接口的可调整大小数组实现”。

你能把setUpView方法改成List吗?如果没有,仍然可以使用以下方法将ArrayList转换为数组:

代码语言:javascript
运行
复制
List<String> menuList;
// ...
String[] arr = (String[]) menuList.toArray();
List<String> list = new ArrayList<String>(Arrays.asList(arr));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21096929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档