我有一个家庭作业,我需要在ArrayList<Interger>
中插入或添加新元素,并遵循以下条件:
元素必须升序。
ArrayList<Integer>
插入方法以 O(n)次运行。
这是我在添加新元素之前检查重复元素的插入方法。
public void insert(int x){
//effect: Check duplicate elements if not x to the elements;
boolean found = false;
if(super.size()!=0){
for(int i=0; i<super.size(); i++){
if(super.get(i)==x){
found = true;
}
}
}
if(found){ return; }
else{ super.add(x); }
}
我该怎么办?谢谢。
除了
这是我的班级名字InSetExtra
public class IntSetExtra extends ArrayList<Integer> {
private static final long serialVersionUID = 1L;
public IntSetExtra(){
super();
}
public void insert(int x){
//effect: Check duplicate elements if not x to the elements;
boolean found = false;
if(super.size()!=0){
for(int i=0; i<super.size(); i++){
if(super.get(i)==x){
found = true;
}
}
}
if(found){ return; }
else{ super.add(x); }
}
public String toString(){
//effect: return string of this.
if(super.size()==0) return "[]";
String s = "[" + super.get(0).toString();
for(int i=1; i<super.size(); i++){
s += ", " + super.get(i).toString();
}
return s += "]";
}
}
我需要插入大尺寸的元素,例如:
IntSetExtra a, b;
a = new IntSetExtra();
b = new IntSetExtra();
for(int i=0; i<30000; i++){ a.insert(2*i); }
for(int i=0; i<30000; i++){ a.insert(i); }
System.out.println("a sub = "+a.toString().substring(0, 37));
我该怎么办?
PS。我的教师只需要使用ArrayList
答案 0 :(得分:25)
这是O(n)中的插入方法。
public void insert(int x) {
int pos = Collections.binarySearch(this, x);
if (pos < 0) {
add(-pos-1, x);
}
}
答案 1 :(得分:9)
以下是我将如何做到:(评论中的解释)
public void insert(int x){
// loop through all elements
for (int i = 0; i < size(); i++) {
// if the element you are looking at is smaller than x,
// go to the next element
if (get(i) < x) continue;
// if the element equals x, return, because we don't add duplicates
if (get(i) == x) return;
// otherwise, we have found the location to add x
add(i, x);
return;
}
// we looked through all of the elements, and they were all
// smaller than x, so we add ax to the end of the list
add(x);
}
您发布的当前解决方案看起来大致正确,但事实是它不会按升序保存元素。
答案 2 :(得分:3)
由于这是作业,我假设你必须使用ArrayList
并手动实现逻辑(而不是使用TreeSet
作为明显的解决方案)。我认为以下提示应该足以让您最终确定实现: - )
如果数组元素已按升序排列,则无需遍历整个数组。只需搜索等于或大于新元素的第一个元素。如果相等,你有一个骗局。如果更大,请在它之前插入新元素并完成。如果所有现有元素都小于新元素,请将其插入到最后。
这将根据需要为您提供O(n)性能。但是,作为改进,您可以考虑使用binary search代替linear。
答案 3 :(得分:1)
为什么不使用TreeSet:
http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeSet.html 击>
由于这是HomeWork问题,需要使用ArrayList,我正在改变我的答案。
您需要线性使用遍历并比较元素。采取相应行动:
我在这里假设使用上述算法添加所有元素。所以ArrayList总是排序:)。
这是代码:
public void insert(int x) {
for (int i = 0; i < size(); i++) {
if (x == get(i)) {
// if new element is equal to current element do nothing and
// return
return;
} else if (x > get(i)) {
// if new element is greater than current element traverse to
// next.
continue;
}
// code reaches here if new element is smaller than current element
// add element at this index and return.
add(i, x);
return;
}
// if end of list is reached while traversing then add new element and
// return. (This will add element at the end of list)
add(x);
}
希望这有帮助。
答案 4 :(得分:1)
为新数据结构创建一个类。
每当添加数据值时,对arraylist执行二进制搜索以确保数据值尚未存在。如果它已经存在,则引发异常。如果不存在,请将其插入已排序的位置。
在你的作业中记下有一个现有的数据结构(TreeSet)来执行这个功能,但是通过比你刚创建的更好的实现来实现。
答案 5 :(得分:0)
当我想将非重复元素添加到Set时,我使用TreeSet。试一试!
答案 6 :(得分:-1)
列表是一个列表而不是一个集合,如果它表现得像一个集合,它就会违反合同。在TreeSet中插入应该是O(log(n))左右......