gpt4 book ai didi

java - 如何使用摘要列表

转载 作者:行者123 更新时间:2023-12-02 05:23:27 24 4
gpt4 key购买 nike

我对 Java 比较陌生,刚刚开始学习一段时间。我正在尝试制作聊天信使(客户端-服务器),我需要一种可以存储在线用户的数据结构(一个套接字和一个包含用户名的字符串)。现在我做了很多研究,认为 AbstractList 可以很好地帮助我,但我很快就遇到了问题

public class Collections <E> extends AbstractList<E> {

private int size;
private E[] list;

public Collections() {
size = 0;
list = new E[50];
}

@Override
public E get(int index) {
return list[index];
}
@Override
public boolean add(E element) {


return false;
}

@Override
public int size() {
return list.length;
}
public static void main(String[] args) {
Collections <String>obj = new Collections();
obj.add(new String("1"));
obj.add(new String("5"));

System.out.println("Size = " + obj.size());
}
}

这是我的代码,坦率地说,我无法绕过添加函数......我尝试使用

list = new E[50];

但这会给出一般初始化错误。简而言之,我不知道如何初始化列表对象。所以现在我有三个问题:

  1. 我创建服务器上所有客户端列表的方法好吗?
  2. 我应该如何使用 add() 函数?
  3. 为什么第一行有两次“”?显然它是一个模板,但您不是只需要一次吗?显然,两个地方都需要它,那么第一个是做什么用的,第二个是做什么用的呢? (我学到的教程并没有安静地解释它)

最佳答案

要将项目添加到列表中,您可以执行此操作,无需创建自己的列表类

List<String> myList = new ArrayList<String>();
myList.add("Peter");
myList.add("Susan");

现在,如果您想创建所有用户名和套接字的列表,您可以使用 Map。类似的东西

Map<String, Socket> myMap = new HashMap<String, Socket>();
myMap.put("Peter", petersSocket);
myMap.put("Susan", susansSocket);

这将允许您通过用户名检索套接字

Socket petes = myMap.get("Peter");

或者您可以创建自己的用户名和套接字类

public class UsernameSocketPair{
private String name;
private Socket socket;
public UsernameSocketPair(String name, Socket socket){
this.name = name;
this.socket = socket;
}

public String getName(){
return name;
}

public Socket socket(){
return socket;
}
}

然后可以将其放入列表中,例如

List<UsernameSocketPair> myList = new ArrayList<UsernameSocketPair>();
myList.add(new UsernameSocketPair("Peter", petersSocket));

这是否是一个好主意,这取决于代码的其余部分及其结构。

明确回答问题:

  1. 这取决于代码的其余部分及其结构。
  2. 首先不要使用 E[],而是在“获取”元素时使用 Object[] 并强制转换为 E。这样你就可以实例化(例如 Object[] list = new Object[20];
  3. E 在类声明中出现两次,因为您正在扩展 AbstractList 类型的类,并且您正在通过 E 参数化您的类。例如,您可以这样做。

以下内容:

public class MyList extends AbstractList<String>{

}

下面是一个非常有趣的示例,说明如何根据需要实现参数化的抽象列表的具体版本

public class MyList <E> extends AbstractList<E> {

private Object[] list = new Object[10];
private int size = 0;


public E get(int i){
if(i >= size) throw new IndexOutOfBoundsException("duh!");
return (E)list[i];
}

public boolean add(E e){
if(size >= list.length){
Object[] newList = new Object[list.length + 10];
System.arraycopy(list,0, newList, 0, list.length);
list = newList;
}
list[size] = e;
size++;
return true;
}

public int size(){
return size;
}

public static void main(String[] args){
List<String> l = new MyList<String>();
for(int i = 0; i < 100; i++){
l.add(""+i);
}
System.out.println(l.size());
}

}

关于java - 如何使用摘要列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com