【问题标题】:Compare String with Bubble Sort Algorithm将字符串与冒泡排序算法进行比较
【发布时间】:2015-02-03 06:31:27
【问题描述】:

我有一个程序会从数据库中获取几个字符串(announcementId 和announcementTitle),

然后对于从数据库中获取的每个字符串,我想比较它们中的每一个(比较所有获取的announcementId),

如果字符串 (announcementId) 具有不同的值,那么它将使用announcementTitle 创建一个新按钮,因为它是从数据库中获取的(按钮)值。

我尝试学习如何,发现在这种情况下可以使用冒泡排序算法,但是程序中存在一些错误..索引超出范围异常.. 然后我尝试了一些代码并尝试更改数组,但它仍然不起作用。

能否请您看一下我的代码并告诉我错误在哪里以及修复错误的最佳方法

这是我的代码:

    myDb = new Database(ViewAllAnnouncement.this);
    myDb.open();
    totalAnnouncement = myDb.countHowManyAnnouncement(username);
    String temp = Integer.toString(totalAnnouncement);
    //Toast.makeText(getApplicationContext(), temp, Toast.LENGTH_LONG).show();

    String[] announcementTitle = myDb.fetchMyAnnouncement(username);
    String[] announcementId = myDb.fetchAnnouncementId(username);

    for (int i = 0; i < totalAnnouncement; i++) {

        for (int j = 0; j < totalAnnouncement - i; j++) {
            if (j > 0 || j < totalAnnouncement-i) {
                if (!announcementId[j].equals(announcementId[i])) {

                    newBt = new Button(this);
                    newBt.setTag(announcementId[i]);
                    newBt.setText(announcementTitle[i]);
                    newBt.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            // TODO Auto-generated method stub
                            Button mButt = (Button) v;
                            String temp = (String) mButt.getTag();
                            Intent intent = new Intent(
                                    "com.example.teamizer.VIEWCHILDANNOUNCEMENT");
                            intent.putExtra("annId", temp);
                            startActivity(intent);
                        }
                    });
                    layout.addView(newBt);
                }
            }
        }
    }

    myDb.close();

这是我返回announcementId的方法

    public String[] fetchAnnouncementId(String Username) {
    // TODO Auto-generated method stub
    int i = 0;

    String Query = "SELECT b." + ANNOUNCEMENT_ID + " FROM "
            + MS_GROUP_DETAIL + " a, " + MS_ANNOUNCEMENT_DETAIL + " b, "
            + MS_ANNOUNCEMENT + " c WHERE a." + GROUP_ID + " = b."
            + GROUP_ID + " AND b. " + ANNOUNCEMENT_ID + " = c."
            + ANNOUNCEMENT_ID + " AND a." + MEMBER_USERNAME + " =? ORDER BY b." +ANNOUNCEMENT_ID;
    Cursor c = ourDatabase.rawQuery(Query, new String[] { Username });

    String temp[] = new String[c.getCount()];
    int iArray = c.getColumnIndex(ANNOUNCEMENT_ID);

    c.moveToFirst();
    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        temp[i] = c.getString(iArray);
        i++;
    }
    c.close();
    return temp;
}

【问题讨论】:

    标签: java android string bubble-sort


    【解决方案1】:

    如果 冒泡排序 是答案,那么你一定误解了这个问题。我强烈建议您添加

    ORDER BY announcementId
    

    到您的查询结束。这样,数据库将为您按列排序。

    编辑 你可以使用

    ORDER BY 1
    

    按第一列排序(并省略名称)。然后,您的代码应该类似于

    for (int i = 0; i < totalAnnouncement - 1;) {
        int j = i + 1;
        for (; j < totalAnnouncement; j++) {
            if (!announcementId[j].equals(announcementId[i])) {
                break;
            }
        }
        // j is the first value where the announcementId changes
        newBt = new Button(this);
        newBt.setTag(announcementId[i]);
        newBt.setText(announcementTitle[i]);
        newBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button mButt = (Button) v;
                String temp = (String) mButt.getTag();
                Intent intent = new Intent(
                        "com.example.teamizer.VIEWCHILDANNOUNCEMENT");
                intent.putExtra("annId", temp);
                startActivity(intent);
            }
        });
        layout.addView(newBt);
        i = j; // <-- assign j to i.
    }
    

    【讨论】:

    • 我试过你的代码,我已经附加了上面的数据库代码,但它仍然不起作用,仍然有同样的错误,arrayindexoutofbound execption。
    • @JuliusLeo 已编辑。您是否尝试过使用调试器查看它?
    • 您的代码有效,但我仍在尝试理解您的代码和您放置的 cmets.. 非常感谢..
    • @JuliusLeo 我尝试在您的代码之后对内部循环进行模式化(您使用的是内部for 循环);考虑等效的while 循环-int j = i + 1; while (announcementId[j].equals(announcementId[i])) { j++; } 请注意,如果announcementId 在顶部,则您正在计算下一个唯一值,但直到方法中的最后一条语句才使用它。所以你可以将循环移动到i=j;之前。
    • 为什么J应该在循环之前初始化?如果我尝试 for(Int J=i+i +... ),对于第一个循环,使用 for(int i..... ;i++) 而不是 i=j?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-09-22
    • 1970-01-01
    • 2013-06-20
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多