我想知道是否有人可以为我目前正在进行的工作提供一些指示。
我的概念是我必须使用字符串数组列表创建一个排序向量,并能够从数组中添加,删除和查找项目。
我目前正在努力添加一个项目。
在构造函数中我们有:
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;
非常感谢任何和所有帮助。 我还应该提到我不允许使用收藏品。
谢谢!
答案 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