使用已定义的代码从数组中获取字符串

时间:2013-12-03 10:45:02

标签: java arrays string

我从java开始,我需要为我的第一个程序创建一个方法。

我要做的是:我创建逐个字符串,然后将它们保存在String []数组中。这些字符串具有以下结构:

String = word1 word2 word3 code;

然后,当我想要时,我可以列出他们在控制台上显示整个数组。而且,如果我愿意,我可以删除数组中的一个特定字符串。

为实现这一目标,我正在使用我为每个数组设置的代码。每次向数组添加一个String时都会生成此代码,因此此代码与字符串在数组中的位置匹配。

当我想删除一个String时,我必须将该字符串的代码传递给该方法。在这种情况下,代码与字符串的位置相同,所以当我传递代码时,实际上我传递的是位置。

我第一次删除一个字符串,这是有效的,但第二次失败是因为这个。让我们假设我们有:

String0 = word1 word2 word3 0
String1 = word4 word5 word6 1
String2 = word7 word8 word9 2

如果我删除了String1,现在数组被调整为2个字符串(0和1),所以当我添加一个新字符串时,它会将代码2重新设置为这个新字符串,所以我将:

String0 = word1 word2 word3 0    
String2 = word7 word8 word9 2
String3 = word10 word11 word12 2

这一切都是因为将代码写入字符串,我使用数组中String的位置。 那么,以正确的方式获得此功能的最佳方式是什么?

这是我的代码:

我在main中以这种方式向数组添加一个字符串:

musicList.add(new Music(title, autor, format, code));

我以这种方式在控制台上列出数组:

System.out.println(musicList.toString());

我这样删除它:

musicList.delete(code);

方法add(),toString()和delete()是我在其他类中以这种方式定义的自定义方法:

public void add(Music m){
    musicList[pos_counter] = m;
    pos_counter++;
}

public void delete(int code){
    Music[] tempMusic = new Music[musicList.length];
    int index_1 = 0;
    for (int i=0; i<musicList.length; i++){
        if(i != code){
            tempMusic[index_1] = musicList[i];
            index_1++;
        }
    }
    int index_2 = 0;
    for (int i=0; i<tempMusic.length; i++){
        musicList[index_2] = tempMusic[i];
        index_2++;
    }
    pos_counter--;
}

toString()方法只是以String方式显示实例。

Thes Music []实例只调用其他类,其中定义了一个带有音乐列表元素的构造函数(这些是标题,autor,格式或类型和代码):

public Music(String title, String autor, String type, int code){
    this.setTitle(title);
    this.setAutor(autor);
    this.setType(type);
    this.setCode(code);
}

2 个答案:

答案 0 :(得分:1)

首先,我建议使用ArrayList。但是我在你之前的问题中已经看到你不想使用它。因此,如果要使用数组,则代码存在问题。当您从数组中删除某些内容时,您需要更改数组中所有项目的代码,这些代码位于您要删除的项目之后,或者代码与位置不匹配。

编辑:使用ArrayList执行此操作,您可以使用以下命令创建它:

ArrayList<Music> musicList = new ArrayList<Music>();

要添加和删除项目,只需:

musicList.add(new Music("string", "string", "string", musicList.size()));

// If you have the Music instance you want to remove, you can pass it as an argument
musicList.remove(musicItem);

// And if you only have the position, then
musicList.remove(position);

如果使用ArrayList,则不需要将位置存储在Music对象中,但如果由于某种原因需要,则只需使用我编写的size方法作为add函数的最后一个参数。

编辑2:为您添加到列表中的每个项目获取新代码,您可以尝试以下操作:

int max = 0;
for (Music item : musicList) {
    if (item.getCode() > max) {
        max = item.getCode();
    }
}
int newCode = max++;

编辑3:在您解释的所有内容之后,我猜您真正想要的是地图。使用Map,您可以使用键存储项目,并使用此键检索值。你的案例中的关键是音乐项目的代码。这就是它的样子:

Map<Integer, Music> musicMap = new HashMap<Integer, Music>();

// To put a new item in the Map
int max = 0;
for (Integer mapCode : musicMap.keySet()) {
    if (mapCode > max) {
        max = mapCode;
    }
}

int newCode = max++;
musicItem.setCode(newCode);
musicMap.put(newCode, musicItem);

// To remove an item by its value
musicMap.remove(code);

您可以找到有关地图界面here的更多信息。

最后编辑:迭代地图并将其输出打印到控制台,您只需执行以下操作:

for (Music item : musicMap.values()) {
    System.out.println(item);
}

答案 1 :(得分:0)

考虑使用Java Collections

它已经为您实现了插入,删除和其他不错的操作。您可以创建一个“音乐”集合并对其进行操作。