【问题标题】:Array list implementation using generics where the maximum size of the list is dynamic使用泛型实现数组列表,其中列表的最大大小是动态的
【发布时间】:2013-12-18 13:59:15
【问题描述】:

我想问是否有人知道如何解决这个问题。 我收到这条消息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at Main.add(Main.java:40)  // it is for: myList[actSize++] = object;
    at Main.main(Main.java:127) //it is for: ob.add(str+str1+str2); 

我想问一下我所做的是否正确。我想构建一个使用以下泛型的程序:方法添加、删除、获取、包含和大小。但是当我构建程序时,我发现泛型无法创建数组,所以我使用了本网站的另一篇文章:[如何:创建泛型数组并使用弱类型(未选中)。所以这个程序的主题是有人在控制台中输入他的名字和他的电话号码,然后把它放在泛型数组中,这样我就可以把它保存到一个对象中,然后放到一个特定的位置。之后,程序会动态增加阈值,以便用户有很多联系人。然后他会被告知他的联系人是否被复制,并且会立即删除。之后会询问他是否要删除合同,然后程序统计全部,直到用户完成他的工作(添加合同)。

我很高兴听到一些意见。

(如果我的英语听不懂,我很抱歉。)

import java.util.Arrays;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main < T >
{

    private Object[] myList;
    public static int actSize = 0;

    public Main(int s)
    {
        myList = new Object[s];
    }

    public T Array(int i)
    {
        @SuppressWarnings("unchecked")
        final T t = (T) myList[i];
        return t;
    }

    public void add(T object) //end
    {
        if (myList.length - actSize <= 5)
        {
            myList = Arrays.copyOf(myList, myList.length * 2);
            System.out.println("\nNew length: " + myList.length);
        }

        myList[actSize++] = object;
    }

    public void add(T object, int position) //end
    {
        myList[position++] = object;
    }

    public boolean remove(T object) //end
    {
        if (myList[actSize].equals(object))
        {
            myList[actSize] = myList[actSize - 1];
            return true;
        }
        else
            return false;
    }

    public void remove(int position) //end
    {
        myList[position] = myList[position - 1];
    }

    @SuppressWarnings("unchecked")
    public T get(int index) //end
    {
        if (index < actSize)
        {
            return (T) myList[index];
        }
        else
        {
            throw new ArrayIndexOutOfBoundsException();
        }
    }

    public boolean contains(T object) //end
    {
        if (myList[actSize].equals(object))
        {
            return false;
        }
        else
            myList[actSize] = myList[actSize - 1];

        return true;
    }

    public int size() //end
    {
        return actSize;

    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args)
    {
        @SuppressWarnings("rawtypes")
        Main ob = new Main(actSize);
        String str, str1, str2;

        try
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(System. in ));

            while (true)
            {
                System.out.print("Do you want to add a contact? press any key to continue or n to exit :");
                String str5 = br.readLine();

                if ("n".equalsIgnoreCase(str5))
                {
                    System.exit(1);
                }

                System.out.print("Enter your First Name :");
                str = br.readLine();

                System.out.print("Enter your Last Name :");
                str1 = br.readLine();

                System.out.print("Enter your Phone Number :");
                str2 = br.readLine();

                ob.add(str + str1 + str2);
                ob.add(str + str1 + str2, actSize);

                if (ob.contains(str + str1 + str2) == true)
                {
                    System.out.println("The contact you entered is duplicated");
                    ob.remove(ob.contains(str + str1 + str2));
                    System.out.println("The contact has been removed");
                }

                System.out.print("Do you want to add contracts? press y to continue :");
                String str3 = br.readLine();
                System.out.println("You just entered:" + str3);

                if ("y".equalsIgnoreCase(str3))
                {
                    System.out.print("Which contract do you wish to be removed?");
                    String str4 = br.readLine();

                    if (str4.equals(actSize))
                    {
                        ob.remove(actSize);
                        System.out.println("The contact has been deleted.");
                    }
                }
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

}

【问题讨论】:

  • 为什么不使用java.util.ArrayList类?
  • 我已经有了,但我总是对泛型 T 犯同样的错误,即我不能使用泛型数组。我不知道,也许我还没有尝试过。也许你能用代码告诉我如何使用它?或者给我发个链接?
  • 您基本上是在重写 ArrayList(由数组支持的 List 实现。)。我建议你看看这个类的实际代码。

标签: java arrays generics dynamic console


【解决方案1】:

为什么不使用List&lt;YourGenericType&gt; list = new ArrayList&lt;YourGenericType&gt;(); 现在您可以拨打list.size(); list.add(); list.set(); list.get();...。 ArrayList 也有动态大小。

我建议这样:删除您的 Main 并将您的 main 方法更改为这样的:

import java.util.*;
import java.io.*;

public class Test {

    public static void main(String[] args) {

        List<String> list = new ArrayList<String>();
        String str, str1, str2;
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    System.in));
            while (true) {

                System.out
                        .print("Do you want to add a contact? press any key to continue or n to exit :");
                String str5 = br.readLine();

                if ("n".equalsIgnoreCase(str5)) {
                    System.exit(1);
                }

                System.out.print("Enter your First Name :");
                str = br.readLine();

                System.out.print("Enter your Last Name :");
                str1 = br.readLine();

                System.out.print("Enter your Phone Number :");
                str2 = br.readLine();

                StringBuilder sb = new StringBuilder();
                sb.append(str + str1 + str2);

                for (int i = 0; i < list.size(); i++) {
                    String s = list.get(i);
                    if (s.equals(sb.toString())) {
                        System.out.println("Duplicate");
                        list.remove(i);
                    }
                }
                list.add(sb.toString());

                System.out
                        .print("Do you want to add contracts? press y to continue :");
                String str3 = br.readLine();
                System.out.println("You just entered:" + str3);

                if ("y".equalsIgnoreCase(str3)) {
                    System.out
                            .print("Which contract do you wish to be removed?");
                    String str4 = br.readLine();

                    int index = Integer.parseInt(str4);
                    if (index < list.size() && index > 0) {
                        list.remove(index);
                    }

                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

【讨论】:

  • 所以你建议: List list = new ArrayList();方法 main() list.set list.get 因为我不明白该怎么做。你能给我一个链接吗?或者也许是一个小程序作为开始?
  • 我很想用 List 代替 List 吗?
  • 当然你可以这样做 :) 我还更新了我的答案,这样你的程序就会随着我的更改运行。我还在检查重复后添加了此人,因为它在之前添加时总是会说它是重复的。只需看看我为您提供的解决方案,如果您想将字符串更改为 您也可以
  • 非常感谢德伦。但我刚刚读到我必须将所有方法保留在我的项目中。我是否可以在 main 方法中包含这些方法以便以某种方式使用它们?我在想也许和 whoAmI 给我的答案。让我的程序的数量和原因将阈值加倍,以便它可以是动态的。
  • 不太确定您现在要达到的目标。你能把事情弄清楚一点吗?
【解决方案2】:

首先,您可以使用List 来存储未知数量的数据。

对于您的代码:

myList[actSize++] = object;

抛出异常,因为 myList 被初始化为 0 长度。所以你不能把任何东西放在索引 0 中。

【讨论】:

  • 也许如果我改变方法 Main 而不是 s,放一个数字就能解决问题?
  • 它可以提供帮助。但是如果你输入一个数字并尝试输入比数字更多的元素,你会再次遇到问题。
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2021-08-13
相关资源
最近更新 更多