排序字符串数组 - 按顺序插入值

时间:2016-11-29 21:54:40

标签: java arrays string vector

我想知道是否有人可以为我目前正在进行的工作提供一些指示。

我的概念是我必须使用字符串数组列表创建一个排序向量,并能够从数组中添加,删除和查找项目。

我目前正在努力添加一个项目。

在构造函数中我们有:

private int maxlength;
private int numberofitems;
private String[] data;
private int growby;

并且他们已经被赋予了价值观:

maxlength = 10;
numberofitems = 0;
data=new String[maxlength];
growby=10;

然后我有一个带字符串值的函数,需要将值插入数组中:

public void AddItem(String value)
{

  if (maxlength == data.length)
  {
    GrowArray();
  }

  //Need Help here
}

^^这是我需要帮助的地方。

GrowArray只是创建一个临时数组,它将maxlength增加10,并将所有值从旧数组复制到新数组。

private void GrowArray()
{
    String[] data2=new String[data.length+growby];
    System.arraycopy(data, 0, data2, 0, data.length);
    data=data2;
}

我的逻辑是:

  • 我需要循环遍历数组,并将搜索值与数组中的每个项目进行比较,看看它是否属于当前数组值之前或之后。

我知道这应该是这样的:data [i] .compareTo(value)< 0;

非常感谢任何和所有帮助。 我还应该提到我不允许使用收藏品。

谢谢!

4 个答案:

答案 0 :(得分:1)

只需使用Arrays.binarySearch()即可。它搜索已排序数组中的元素。如果找不到数组,则返回插入点(或者更确切地说是( - (插入点) - 1))。

所以丢失的代码可能如下所示:

// find index for insertion
int insertionIndex = Arrays.binearySearch(data, value);
if (insertionIndex < 0) {
    insertionIndex = -insertionIndex - 1;
}

// move elements
if (insertionIndex < data.length) {
    System.arraycopy(data, insertionIndex, data, insertionIndex + 1, data.length - insertionIndex - 1);
}

// insert element
data[insertionIndex] = value;

幸运的是,Arrays.binarySearch使用compareTo

答案 1 :(得分:0)

java.lang.String实现Comparable,意味着您可以为compare方法创建任何实现。

自定义Comparator可能如下所示:

public class sortString implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
}

注意: compare()方法必须返回一个int值。

对数据数组进行排序的代码如下所示:

Collections.sort(ArrayList, new sortString());

元素的版本可以不考虑String的位置,并且在添加所有字符串后,您可以将它们排序在一起并获得Sorted ArrayList。

另一个选项可以是在迭代字符串的ArrayList时使用compare()方法,并找到添加新数据项的正确位置。

答案 2 :(得分:0)

您需要对String内的addItem(String value)元素进行排序,如下面的代码所示,并带有内联注释(以下逻辑使用compareTo()String个对象) :

      public void addItem(String value) {

          //add element to array and increment numberofitems
          data[numberofitems] = value;
          numberofitems++;

          //check the array size and call grow
          if (maxlength == data.length) {
             GrowArray();
          }

          //Sort the String elements
          String temp =null;
          for(int i=0;i< data.length;i++) {
              for(int j=0;j<data.length;j++) {
                    if(data[i].compareTo(data[j]) < 0) {
                       temp = data[i];
                       data[i]= data[j];
                       data[j] =temp;
                    }
                }
          }
        }

另外,我建议你遵循方法/类/变量名的Java命名标准(GrowArray()不符合Java命名标准,详见here。)

答案 3 :(得分:0)

一种简单的方法是将新项目附加到数组的末尾,然后将其与前一项目交换(如果它更小),重复直到它处于正确的位置。我还纠正了你增长阵列的条件。您不需要maxlength成员字段,而是data.length

// Grow array when array is full.
if (numberofitems >= data.length) GrowArray();

// Append to the end, at this point we always have enough space.
data[numberofitems++] = value;

// data[i] holds the new item
// Loop until we reach the head (i==0) or data[i]>=data[i-1]
for (int i = numberofitems - 1;
     i > 0 && data[i].compareTo(data[i-1]) < 0;
     i--) {
    // Swap data[i] (the new item) with its predecessor.
    String t = data[i-1];
    data[i-1] = data[i];
    data[i] = t;
}

要遵循Java命名约定,请重命名字段和方法。

numberofitems -> numberOfItems
growby -> growBy
GrowArray -> growArray