使用数组数组作为指向Java中可扩展的类列表的指针

阅读在Java中通过引用传递字符串中的第一个答案? 我(如在旧的指针吓坏了C书呆子)有一个关于在java中使用数组作为指针的问题。

在一个设置例程中,有多个可编辑的EditText框用于存储多个字符串。 这包括添加一个EditText框按钮。 所以在屏幕上,按钮之后是一些EditText框。 我有一个类似的URL来存储。

而不是像20行代码一样重复一遍又一遍地处理不同的这样的设置数据项,对于方法(C中的函数)来说显然是一种情况,问题是如何保存有关EditText框的信息当用户按下保存按钮时创建。 在C中,您只需发送一个编辑框数组的指针,并在创建新编辑框时重新分配编辑框数组。 在Java中,我无法重新分配editboxes数组来扩展它,但可以创建并克隆它。 但是这跟editboxes数组不一样。 但是,然后我在调用方法中有旧的编辑框数组,而不是新的。 但是很明显,使用字符串可以创建一个单位的字符串数组并发送给方法并更新它。 这显然也可以用于编辑框数组,使编辑框数组中的一个编辑框数组可以被调用方法更新并展开。

String[][] stringList = new String[1][];
stringList[0] = new String[2];
stringList[0][0] = new String("Sonny");
stringList[0][1] = new String("Ronny");
ExpandArray(context, stringList);
public static void ExpandArray(Context context, String[][] stringPtr) {
    stringPtr[0][1]="Zeke";
    String[] strings = new String[3];
    System.arraycopy(stringPtr[0], 0, strings, 0, stringPtr[0].length);
    stringPtr[0] = strings;
    stringPtr[0][2]="Sue";
}

EditText[][] EditTextList = new EditText[1][];
EditTextList[0] = new EditText[2];
EditTextList[0][0] = new EditText(context);
EditTextList[0][1] = new EditText(context);
ExpandArray(context, EditTextList);
public static void ExpandArray(Context context, EditText[][] EditTextPtr) {
    EditText[] EditTexts = new EditText[3];
    System.arraycopy(EditTextPtr[0], 0, EditTexts, 0, EditTextPtr[0].length);
    EditTextPtr[0] = EditTexts;
    EditTextPtr[0][2]== new EditText(context);
}

问题1阅读在Java中通过引用传递字符串中的第一个答案? 所有评论都受到两个第一个StringBuilder解决方案的强烈支持,但没有解释为什么。 这就是我们在这里讨论类数组的String,可能会有所不同。 *我觉得我只是用Java语法制作了C语言解决方案,可能会有更好的Java文化解决方案? 你知道C nerds对于指向指针等的指针是疯狂的,而且这种感觉很奇怪。 *

有没有比数组更好的类数组解决方案(解决方案3)?

我正在学习Java文化和我的一个按钮和n个EditText框的实际方法(工作正常),但感觉像车库文化:

public static LinearLayout TextListbox(Context context, EditText[][] EditTextboxes, String Title, String DataStringsDimension) {
    final Context contextTextListbox = context;
    final EditText[][] EditboxTextListbox=EditTextboxes;
    final String ItemText = Title;
    final LinearLayout layoutEditTextListbox = new LinearLayout(contextTextListbox);
    layoutEditTextListbox.setOrientation(LinearLayout.VERTICAL);
    layoutEditTextListbox.setX(layoutEditTextListbox.getX() + 15);
    layoutEditTextListbox.setBackgroundColor(Color.rgb(0xFF, 0xE8, 0xAA));

    if (DataStringsDimension != null)
        EditboxTextListbox[0] = new EditText[getJniListDataSize(DataStringsDimension)];
    else
        EditboxTextListbox[0] = new EditText[0];
    final Button button = new Button(contextTextListbox);
    button.setText("+ " + ItemText);
    button.setTag(EditboxTextListbox[0].length);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Enlarge to Edit box array
            EditText[] EditboxArrayTemp = new EditText[EditboxTextListbox[0].length + 1];
            System.arraycopy(EditboxTextListbox[0], 0, EditboxArrayTemp, 0, EditboxTextListbox[0].length);
            EditboxTextListbox[0] = EditboxArrayTemp;
            // Register a new edit box
            EditboxTextListbox[0][EditboxTextListbox[0].length - 1] = new EditText(contextTextListbox);
            EditboxTextListbox[0][EditboxTextListbox[0].length - 1].setHint(ItemText);
            EditboxTextListbox[0][EditboxTextListbox[0].length - 1].setInputType(InputType.TYPE_CLASS_TEXT);
            layoutEditTextListbox.addView(EditboxTextListbox[0][EditboxTextListbox[0].length - 1]);
        }
    });
    layoutEditTextListbox.addView(button);

    if (EditboxTextListbox[0].length > 0) {
        String[] DataStrings = getJniTextUnceListData(DataStringsDimension);
        for (int iSlotTitle = 0; iSlotTitle < EditboxTextListbox[0].length; iSlotTitle++) {
            EditboxTextListbox[0][iSlotTitle] = new EditText(contextTextListbox);
            EditboxTextListbox[0][iSlotTitle].setText(DataStrings[iSlotTitle]);
            EditboxTextListbox[0][iSlotTitle].setTag(DataStrings[iSlotTitle]);
            EditboxTextListbox[0][iSlotTitle].setHint(ItemText);
            EditboxTextListbox[0][iSlotTitle].setInputType(InputType.TYPE_CLASS_TEXT);
            layoutEditTextListbox.addView(EditboxTextListbox[0][iSlotTitle]);
        }
    }
    return layoutEditTextListbox;
}

问题2 Java文化当然会得到改善吗? 任何聪明的想法?

我把它作为我的SetupDlg类中的一个方法,是否有任何理由让它成为它自己的类?

对于如何编辑n个要编辑的文本字符串可能会有一些更好的想法。


你可以使用ArrayList而不是Array。 数组具有固定大小,但ArrayList可以轻松增长。 等同于:

String[][] stringList = new String[1][];
stringList[0] = new String[2];
stringList[0][0] = new String("Sonny");
stringList[0][1] = new String("Ronny");
ExpandArray(context, stringList);
public static void ExpandArray(Context context, String[][] stringPtr) {
    stringPtr[0][1]="Zeke";
    String[] strings = new String[3];
    System.arraycopy(stringPtr[0], 0, strings, 0, stringPtr[0].length);
    stringPtr[0] = strings;
    stringPtr[0][2]="Sue";
}

将会:

List<List<String>> stringList = new ArrayList<List<String>>();
stringList.add(new ArrayList<String>());
stringList.get(0).add(new String("Sonny"));
stringList.get(0).add(new String("Ronny"));
ExpandArray(context, stringList);
//Instead of expand array
stringList.get(0).add(new String("Sue"));

对于editText只需使用:

List<List<EditText>> editText = new ArrayList<List<EditText>>()

ArrayList的大小根据需要增加。

关于通过引用传递,在java中,所有东西都是按值传递的。 只有类对象通过引用传递。 所以只有当你传递一个类对象并对其进行修改时,这个改变才会反映在该函数之外。

对于字符串,您可以使用字符串构建器或字符串对象,但是如果它的唯一一个字符串也适用:

void main(){
    string txt = "foo";
    txt = addString(txt);
    System.out.println(txt);
}
String addString(String txt)
{
    txt += " bar";
}

输出将是: foo bar

希望这可以帮助!!

链接地址: http://www.djcxy.com/p/20897.html

上一篇: Using arrays of arrays as pointers to expandable lists of classes in Java

下一篇: Java class file from PL/SQL procedure