Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList,每个对象一次只能存在于一个ArrayList中_Java - Fatal编程技术网

Java ArrayList,每个对象一次只能存在于一个ArrayList中

Java ArrayList,每个对象一次只能存在于一个ArrayList中,java,Java,我有两个简单的类,NetworkDevice.java和Channel.java 在Channel.java中,我有 private ArrayList<Channel> channel = new ArrayList<Channel>(); Channel.java如下所示 public class NetworkDevice { // Fields private String address; //Constructor

我有两个简单的类,NetworkDevice.java和Channel.java

在Channel.java中,我有

private ArrayList<Channel> channel = new ArrayList<Channel>();
Channel.java如下所示

    public class NetworkDevice {

    // Fields
    private String address;
    //Constructor
    public NetworkDevice(String address, Channel channel){
        this.address = address;
        addToChannel(channel);
    }

    // Add a NetworkDevice to the 
    public void addToChannel(Channel channel){
            channel.addChannel(this);
    }
}
   import java.util.List;
import java.util.ArrayList;

public class Channel {

    // Fields
    private ArrayList<Channel> channel = new ArrayList<Channel>();
    private int number;
    private List<Packet> packet;

    /*
     * Constructor
     * Initializes the number of the the Channel
     * Allows for a packet to be passed in
     */
    public Channel(int number, Packet packets) {
        this.number = number;
        packet.add(packets);
    }

    /*
     * Adds to the Channel array
     * @Param a network device object
     */
    public void addChannel(NetworkDevice device) {
        channel.add(this);
    }
}
import java.util.List;
导入java.util.ArrayList;
公共类频道{
//田地
专用ArrayList通道=新建ArrayList();
私有整数;
私有列表包;
/*
*建造师
*初始化通道的编号
*允许传入数据包
*/
公共信道(整数、数据包){
这个数字=数字;
packet.add(包);
}
/*
*添加到通道阵列
*@Param a网络设备对象
*/
公共无效添加通道(网络设备){
频道。添加(此);
}
}

看起来你把很多名字和概念搞乱了

我重写了一点代码,这样对我来说才有意义。也就是说,在我看来,没有任何真正的线索可以实现什么。但看看我的代码会带来什么结果:

public class MultiInst {
    static public class NetworkDevice {
        private final String    mAddress;
        private Channel         mCurrentChannel = null;

        public NetworkDevice(final String address, final Channel channel) {
            this.mAddress = address;
            addToChannel(channel);
        }

        public void addToChannel(final Channel channel) {
            if (mCurrentChannel == channel) return; // may do this
            if (mCurrentChannel != channel && mCurrentChannel != null) mCurrentChannel.removeNetworkDevice(this);

            mCurrentChannel = channel;
            mCurrentChannel.addNetworkDevice(this);
        }

        @Override public String toString() {
            return mAddress;
        }
    }


    static public class Channel {

        private final ArrayList<NetworkDevice>  mNetworkDevices = new ArrayList<>();
        private final List<Packet>              mPackets        = new ArrayList<>();
        private final int                       mNumber;

        public Channel(final int number, final Packet... packets) {
            this.mNumber = number;
            if (packets != null) for (final Packet p : packets) {
                mPackets.add(p);
            }
        }

        public void addNetworkDevice(final NetworkDevice device) {
            mNetworkDevices.add(device);
        }
        public void removeNetworkDevice(final NetworkDevice device) {
            mNetworkDevices.remove(device);
        }

        @Override public String toString() {
            String acc = "Channel #" + mNumber + ":\t";
            if (mNetworkDevices.size() < 1) return acc + " [EMPTY] ";
            for (final NetworkDevice c : mNetworkDevices) {
                acc += "\t" + c;
            }
            return acc;
        }
    }



    public static void main(final String[] args) {
        final Channel c1 = new Channel(1);
        final Channel c2 = new Channel(2);
        final NetworkDevice d = new NetworkDevice("lol", null);

        System.out.println("Start\n");

        System.out.println(c1);
        System.out.println(c2);
        System.out.println();

        System.out.println("Adding to channel 1...");
        d.addToChannel(c1);
        System.out.println(c1);
        System.out.println(c2);
        System.out.println();

        System.out.println("Adding to channel 2...");
        d.addToChannel(c2);
        System.out.println(c1);
        System.out.println(c2);
        System.out.println();

        System.out.println("End");
    }

}

问题是什么?将连接的通道放入网络设备是一种选择吗?作为
可选的
频道可以解决这个问题。这是如何工作的?问题是技术规格
addChannel(网络设备)
到底在做什么?您不使用
设备
,而是将“此”频道添加到频道列表中。。。
Start

Channel #1:  [EMPTY] 
Channel #2:  [EMPTY] 

Adding to channel 1...
Channel #1:     lol
Channel #2:  [EMPTY] 

Adding to channel 2...
Channel #1:  [EMPTY] 
Channel #2:     lol

End