Страницы

Поиск по вопросам

Показаны сообщения с ярлыком arraylist. Показать все сообщения
Показаны сообщения с ярлыком arraylist. Показать все сообщения

четверг, 9 апреля 2020 г.

masm как сделать массив с изменяемой длиной

#массивы #ассемблер #arraylist #masm32

                    
Возможно ли изменить длинну массива (dd) и затем записать её в eax?
    


Ответы

Ответ 1



И нет, и да. Дело в том, что результат декларации dd - просто последовательность байт в бинарнике, которая статически грузится в память. Так что менять размер тут просто нечему. dd не является командой динамического выделения памяти - она просто статически помещает в бинарник нужную последовательность байт. Хотите выделить память - обратитесь к операционной системе и попросите. Через системный вызов.

понедельник, 30 марта 2020 г.

Сортировка объектов классов в разные массивы

#java #массивы #arraylist


Есть Class1 и Class2. И есть класс, который должен создавать массивы из этих классов.
Если передавать в конструктор объект неизвестного класса и там делать проверку, то
возникает ошибка. Как это сделать?
Класс для создания массива:

 package com.company;

 import java.util.ArrayList;

public class Generic {
 private ArrayList arr1 = new ArrayList<>();
 private ArrayList arr2 = new ArrayList<>();

 Generic(Object obj)
 {
     if (obj instanceof Class1)
     {
         this.arr1.add(obj); // Здесь ошибка возникает, хотя делаем проверку
     }
 }
}

    


Ответы

Ответ 1



Следует явно привести тип переменной к классу: import java.util.ArrayList; public class Generic { private ArrayList arr1 = new ArrayList<>(); private ArrayList arr2 = new ArrayList<>(); Generic(Object obj) { if (obj instanceof Class1) { this.arr1.add((Class1)obj); // Здесь добавляем приведение типа } } }

воскресенье, 15 марта 2020 г.

Определить, какие ключевые слова языка Java содержит файл

#java #строки #java_ee #arraylist


Нагуглил только contains, но он почему-то не работает.. видимо делаю что-то не так

keyWords - ArrayList


sortingList тоже, я так понимаю нужно каким-то образом сравнить все слова в файле
со списком моих слов, а как чет не доходит

for (int i = 0; i < 50; i++) {
    if (sortingList.get(index).contains(keyWords.get(i))) {
        counter++;              
    }
}


Ответ ниже помог, но теперь проблема с повторяющимися словами. они не учитываются

for (String st : keyWords) {
                for (String g : sortingList) {
                    if (st.contains(g) && g.length() > 1) {

                        sortedList.add(g);
                        counter++;
                    }
                }
            }

    


Ответы

Ответ 1



Если честно я не совсем понял вопроса. Вы хотите в увеличивать counter за каждое совпадение слов? Если да, то лучше воспользоваться циклом for-each и сделать вот так. for (String s : keyWords) { for (String g : sortingList) { if (s.contains(g)) { counter++; } } }

пятница, 13 марта 2020 г.

AutoCompleteTextView для ArrayList собственного класса

#java #android #arraylist


Создал на форме AutoCompleteTextView и передаю в него ArrayList, состоящий из элементов,
созданного класса Person:

class Person {

    private String Name;

    public String getName() {
        return Name;
    }

    public void setName(String firstName) {
        this.Name = firstName;
    }
}


ArrayList не пустой, элементы в нем есть, проверял.

AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_message);
    ArrayAdapter adapter = new ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item,
list);
    textView.setAdapter(adapter);


Ошибок в коде нет, но во время тестирования и ввода текста, виджет не работает. Как
сделать так, чтобы при наборе, виджет выдавал мне список элементов из ArrayList, соответствующих
введенному тексту? (в классе только одно поле, по нему поиск и идет)
    


Ответы

Ответ 1



Реализуйте метод toString() в своем классе-модели: class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return name; } } либо реализуйте собственный адаптер на основе стандартного, если требуется более сложный вывод. PS: имена переменных и экземпляров классов в Java принято писать с маленькой буквы в lowerCamelCase-стиле. С Большой буквы пишутся имена классов

воскресенье, 8 марта 2020 г.

Java Десериализация ArrayList в цикле

#java #сокет #arraylist


Ребята, добрый день! 

Я новичок и выполняю следующее задание. Нужно построить клиент-серверное приложение,
где клиенты отправляют на сервер объекты периодически. сервер эти значения добавляет
в ArrayList и периодически рассылает клиентам. Проблема в том, что на стороне клиента
читается не весь ArrayList. а читается только первые несколько элементов. Помогите
разобраться. Коды и вывод информации ниже.

СЕРВЕРНАЯ ЧАСТЬ

             package sockets;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class ServerSocketProg extends JFrame implements Runnable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    ArrayList users;
    private ArrayList clientObjectOutputStreams;
    private ArrayList stringArrayList = new ArrayList();
    private ServerSocket serverSock;
    private JTextArea ta_chat;
    private Path path;
    private BufferedWriter fileWriter;

    public ServerSocketProg() {
        initComponents();


        path = Paths.get("ServerLogger.txt");
        try {
            fileWriter = Files.newBufferedWriter(path, 
                    StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() 
    {
        clientObjectOutputStreams = new ArrayList();
        users = new ArrayList();  

        try 
        {
            serverSock = new ServerSocket(2222);
            while (true) 
            {
                Socket clientSock = serverSock.accept();                        
               
                ObjectOutputStream objectWriter = new ObjectOutputStream(clientSock.getOutputStream());
                clientObjectOutputStreams.add(objectWriter);

                Thread listenerObject = new Thread(new ClientObjectHandler(clientSock,
objectWriter));
                listenerObject.start();
                Thread intervalSender = new Thread(new SendArrayWithInterval());
                intervalSender.start();

                ta_chat.append("Got a connection. \n");
                fileWriter.write("Got a connection. \r\n");
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            ta_chat.append("Error making a connection. \n");
            try {
                fileWriter.write("Error making a connection. \r\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }   



    class ClientObjectHandler implements Runnable   
    {
           BufferedReader reader;
           Socket sock;
           ObjectOutputStream client;
           ObjectInputStream objectReader;

           public ClientObjectHandler(Socket clientSocket, ObjectOutputStream user)
throws IOException 
           {
                client = user;
                try 
                {
                    sock = clientSocket;
                    objectReader = new ObjectInputStream(sock.getInputStream());
               
                }
                catch (Exception ex) 
                {
                    ta_chat.append("Unexpected error... \n");                   
                    fileWriter.write(ex.toString());
                }

           }

           @Override
           public void run() 
           {
                String message;    

                try 
                {
                    while ((message = (String) objectReader.readObject()) != null) 
                    {
                        ta_chat.append("Received Object: " + message + "\n");
                        fileWriter.write("Received Object: " + message + "\r\n");
                        stringArrayList.add(message);                           
          
                    } 
                 } 
                 catch (Exception ex) 
                 {
                    ta_chat.append("Lost a connection. \n");
                    try {
                        fileWriter.write("Lost a connection\r\n");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    clientObjectOutputStreams.remove(client);
                 } 
           } 
        }

    class SendArrayWithInterval implements Runnable{
        @Override
        public void run() {
            while(true){
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(stringArrayList.size()>0){
                    ta_chat.append("Telling everyone Array...\n");                  
                    sendEveryoneObject();
                }
            }
        }
    }

    public void sendEveryoneObject() {
        Iterator it = clientObjectOutputStreams.iterator();

        while (it.hasNext()) 
        {
            try 
            {
                ObjectOutputStream outputWriter = (ObjectOutputStream) it.next();


                outputWriter.writeObject(stringArrayList);

                outputWriter.flush();

                ta_chat.append("Sending: " + stringArrayList.toString() + "\n");        
                ta_chat.setCaretPosition(ta_chat.getDocument().getLength());
                fileWriter.write("Sending: " + stringArrayList.toString() + "\r\n");

            } 
            catch (Exception ex) 
            {
                ex.printStackTrace();
                ta_chat.append("Error telling everyone. \n");
                try {
                    fileWriter.write("Error telling everyone. \r\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }




    }


    private void initComponents() {
        JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
        ta_chat = new javax.swing.JTextArea(40, 50);        
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Chat - Server's frame");
        setName("server");        

        jScrollPane1.add(ta_chat);
        jScrollPane1.setViewportView(ta_chat);
        add(jScrollPane1);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent arg0) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }); 

        setSize(400, 600);
        setVisible(true);
        pack();
    }



    public static void main(String[] args) {        
        Thread starter = new Thread(new ServerSocketProg());
        starter.start();            
    }
}


КЛИЕНТСКАЯ ЧАСТЬ: 

package sockets;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class ClientsSocketsProgram extends JFrame implements Runnable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String address = "localhost";
    private int port = 2222;
    private Boolean isConnected = false;  
    private static int instance = 0;
    private Socket sock;
    private ObjectOutputStream objectWriter;
    private ObjectInputStream objectReader; 
    private JTextArea ta_chat;
    private Path path;

    private int incrementerToSend = 0;

    public ClientsSocketsProgram() {

        initComponentsClientFrame();
        connectToServer();       

        Thread incomeReader = new Thread(new IncomingReader());
        incomeReader.start();
    }   

    class IncomingReader implements Runnable
    {
        ArrayList inputArrayList;// = new ArrayList();
        @Override
        public void run() 
        {
            ArrayList here = new ArrayList();


            try 
            {
                while( true  ){

                    here =(ArrayList) objectReader.readObject();        
           

                    ta_chat.append("Object received: " + here.toString() + "\n "); 
                    ta_chat.setCaretPosition(ta_chat.getDocument().getLength());
             
                }
           }catch(Exception ex) {

               ex.printStackTrace();
           }
        }



    }

    @Override
    public void run() { 
        while(isConnected){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ta_chat.append("Sending " + incrementerToSend + "\n");

            sendObject(" " + incrementerToSend);
            ++incrementerToSend;
        }

    }




    private void initComponentsClientFrame() {

        JScrollPane jScrollPane = new javax.swing.JScrollPane();
        ta_chat = new javax.swing.JTextArea(20, 30);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle(" Chat - Client's frame");
        setName("client"); 


        jScrollPane.add( ta_chat );
        jScrollPane.setViewportView(ta_chat);
        add(jScrollPane);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent arg0) {
                closeConnections();
            }
        }); 

        setSize(400, 600);
        setVisible(true);
        pack();
    }



    private void connectToServer() {
        if (!isConnected) 
        {
            try 
            {
                sock = new Socket(address, port);                
                objectReader = new ObjectInputStream(sock.getInputStream());
                objectWriter = new ObjectOutputStream(sock.getOutputStream()); 
                isConnected = true; 
            } 
            catch (Exception ex) 
            {
                ta_chat.append("Cannot Connect! Try Again. \n");

            }

        } else if (isConnected) 
        {
            ta_chat.append("You are already connected. \n");

        }
    }

    private void sendObject(String text) {

        try  {
            objectWriter.writeObject(text);
            objectWriter.flush();           
        } catch (Exception ex) {
            ta_chat.append("Message was not sent. \n");


            ex.printStackTrace();
        }

    }

    private void closeConnections(){
        if(isConnected){
            try{
                objectWriter.close();
                objectReader.close();
                sock.close();

                isConnected = false;
            }catch(Exception e){
                e.printStackTrace();
            }
        }       
    }





    public static void main(String args[]) 
    {
        Thread thread = new Thread(new ClientsSocketsProgram());
        thread.start();

    }


}


ВЫВОД СЕРВЕРНОЙ ЧАСТИ (ЗАПУЩЕНО 2 КЛИЕНТА): 

         Got a connection. 
Received Object:  0
Received Object:  1
Telling everyone Array...
Sending: [ 0,  1]
Received Object:  2
Got a connection. 
Received Object:  3
Received Object:  0
Received Object:  4
Received Object:  1
Telling everyone Array...
Sending: [ 0,  1,  2,  3,  0,  4,  1]
Sending: [ 0,  1,  2,  3,  0,  4,  1]
Telling everyone Array...
Sending: [ 0,  1,  2,  3,  0,  4,  1]
Sending: [ 0,  1,  2,  3,  0,  4,  1]
Received Object:  5
Received Object:  2
Received Object:  6
Received Object:  3
Telling everyone Array...
Sending: [ 0,  1,  2,  3,  0,  4,  1,  5,  2,  6,  3]
Sending: [ 0,  1,  2,  3,  0,  4,  1,  5,  2,  6,  3]


ВЫВОД КЛИЕНТСКАЯ ЧАСТЬ: 

Sending 0
Sending 1
Object received: [ 0,  1]
 Sending 2
Sending 3
Sending 4
Object received: [ 0,  1]
 Object received: [ 0,  1]
 Sending 5
Sending 6
Object received: [ 0,  1]
 Sending 7
Object received: [ 0,  1]
 Sending 8
Sending 9
Object received: [ 0,  1]
 Object received: [ 0,  1]
 Sending 10
Sending 11
Object received: [ 0,  1]
 Sending 12

    


Ответы

Ответ 1



Это происходит потому, что вы каждый раз передаете один и тот же объект ArrayList. ObjectInputStream/ObjectOutputStream позволяют передать объект вместе со всеми его полями, которые могут содержать ссылки на другие объекты, которые тоже могут на кого-то ссылаться. Поскольку может быть несколько ссылок на один объект, то при десериализации эти ссылки восстанавливаются, а не создается несколько копий. Т.е. writeObject видит, что этот объект он уже записывал, и кладет в поток ссылку, а readObject возвращает вам ссылку на ранее десериализованный объект. Чтобы этого избежать, вы можете использовать ObjectOutputStream.writeUnshared, чтобы основной объект считался уникальным. Еще можно после записи вызывать ObjectOutputStream.reset() чтобы последующие записи не учитывали ранее сериализованные объекты, и записывали их по-новой, а не в виде ссылок. Может быть стоит создавать новый ArrayList в sendEveryoneObject и рассылать его. Замечу, что вы очень вольно обращаетесь с многопоточностью. ArrayList не является потокобезопасной коллекцией, и не дает никаких гарантий при одновременной модификации (когда два клиента прислали вам сообщение, например). Вам нужно или самостоятельно обеспечить потокобезопасность через synchronized или Lock из java.util.concurrent, использовать Collections.synchronizedList (обратите внимание на способ использования итератора в документации метода), либо использовать какую-то коллекцию из java.util.concurrent (CopyOnWriteArrayList вам не очень подойдет, т.к. много модификаций, но для хранения сообщений может подойти одна из очередей). В последних двух случаях стоит скопировать данные перед отправкой клиентам в локально созданный список. При обращении к компонентам Swing следует использовать SwingUtilities.invokeLater, т.к. все обращения должны выполняться из Event Dispatch Thread. Создавать новый new Thread(new SendArrayWithInterval()) при каждом подключении клиента не нужно, у вас поэтому начинают дублироваться посылки сервера.

среда, 4 марта 2020 г.

Есть какая-нибудь замена sort в ArrayList?

#java #android #сортировка #arraylist


Нужно отсортировать ArrayList, но Android Studio пишет 


  "Call requires API level 24 (current min is 21): java.util.ArrayList#sort"


есть какая-нибудь замена или можно не сортировку, а просто элементы в случайном порядке
по ArrayList раскидать?
    


Ответы

Ответ 1



Collections.sort(list); — сортирует коллекцию, используя компаратор Collections.shuffle(list); — перемешивает коллекцию в случайном порядке

среда, 26 февраля 2020 г.

Массив решетка Python

#python #массивы #list #arraylist


Нужна помощь в решении задачи

Заполните прямоугольный массив целыми числами по образцу (нули стоят на пересечении
строк и
столбцов с нечетными номерами, в остальных клетках стоят единицы).

Пример для n=5m=6
1 1 1 1 1 1
1 0 1 0 1 0
1 1 1 1 1 1
1 0 1 0 1 0
1 1 1 1 1 1


Все на что меня хватило

n, m = 5, 6
mtrx = [[((j+i)%2 + (i-1)%2) for j in range(m)] for i in range(n)]
for k in mtrx:
    print(*k)


Output

1 2 1 2 1 2
1 0 1 0 1 0
1 2 1 2 1 2
1 0 1 0 1 0
1 2 1 2 1 2

    


Ответы

Ответ 1



n, m = 5, 6 mtrx = [ [ 0 if j % 2 and i % 2 else 1 for j in range(m)] for i in range(n)] for k in mtrx: print(*k)

Ответ 2



Спасибо @extrn за обучение) Вариант: n, m = 5, 6 mtrx = [[(~j&1) | (~i)&1 for j in range(m)] for i in range(n)] for k in mtrx: print(*k) Еще один: n, m = 5, 6 mtrx= [[(1-j%2) | (i+1)%2 for j in range(m)] for i in range(n)] for k in mtrx: print(*k)

вторник, 25 февраля 2020 г.

Переделать ArrayList в обычный массив String[]

#java #массивы #arraylist


Есть ArrayList который автоматически заполняется данными(ссылками). Хочу
преобразовать его в простой String[] командой:

public static ArrayList linkList = new ArrayList();

String[] url = new String[linkList.size()]; // ошибка
url = linkList.toArray(url);


Но Eсlipse ругается на  ; причем вне зависимости от того как я пытаюсь преобразовать,
в этом случае тоже будет ошибка:

String[] url = {}; // ошибка
url = linkList.toArray(new String[linkList.size()]);


В этом варианте нет ошибки:

String[] url = linkList.toArray(new String[linkList.size()]);


Но если попытаться вывести на консоль, то вместо данных я получаю вот такую ошибку:


  Ljava.lang.String;@45ds364


А вот такой вариант крашит программу:

lk.setText("Ссылка: " +url[2]);


Такой нормально покажет ссылку:

lk.setText("Ссылка: " +linkList.get(2));


Соответственно вопрос в чем может быть ошибка и  как лучше преобразовать ArrayList
в обычный массив.
    


Ответы

Ответ 1



List list = new ArrayList(); String[] arr = list.toArray(new String[list.size()]); Чтобы вывести массив, необходимо использовать Arrays.toString(): System.out.println(Arrays.toString(arr));

Ответ 2



(Щас меня заминусят, прям чувствую) Попробуйте конвертировать вот так: String[] output = new String[array.size()]; for (int i = 0; i != array.size(); i++) { output[i] = array.get(i); } Мне этот способ не один раз помог.

понедельник, 10 февраля 2020 г.

ArrayList не клонируется

#java #arraylist


Здравствуйте, 

Пытаюсь клонировать ArrayList со всеми переменными. В итоге изменяю значения градусов
в новом листе. И автоматически изменяются данные в старом листе. Хотя использую пример,
в котором данные старого листа должны остаться неизменными.

ArrayList celsius = new ArrayList();
ArrayList fareng = (ArrayList) celsius.clone();

for(HeatSensor h: fareng) { 
    double far = h.getCelsius();
    far = 9*far/5 + 32;

    h.setCelsius(far);

    System.out.println(h.toString());
}


Чтобы было понятнее, вот что выводится на экран:

================celsius============================  
Heat : 70.0, 1/02/2017  
Heat : 30.0, 1/02/2017  
Heat : 35.0, 3/02/2017  

================fahrenheit==========================  
Heat : 158.0, 1/02/2017  
Heat : 86.0, 1/02/2017  
Heat : 95.0, 3/02/2017  

================celsius============================    
Heat : 158.0, 1/02/2017   
Heat : 86.0, 1/02/2017    
Heat : 95.0, 3/02/2017    


Так же имеется другой вопрос относительно этой же программы.
найти максимальное значение в ArrayList
    


Ответы

Ответ 1



Метод clone определен в ArrayList как копирование ссылок элементов. public Object clone() { try { ArrayList v = (ArrayList) super.clone(); v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(e); } } Таким образом, элементы равны с точностью до ссылки celsius.get(i) == fareng.get(i) для любого i, и при изменении элемента в одном списке вы измените его же в другом списке. Для решения вашего вопроса нужно воспользоваться глубоким копированием, то есть сделать дополнительно и копии самих элементов. for (HeatSensor h : celsius) { fareng.add(h.clone()); } P.S. в разработке не рекомендуется использовать метод clone. Он считается плохим дизайном в приложении. Вам стоит воспользоваться копированием через конструктор. List fareng = new ArrayList<>(celsius.size()); for (HeatSensor h : celsius) { fareng.add(new HeatSensor(h)); } И сам конструктор: public HeatSensor(HeatSensor another) { this.celsius = another.celsius; // и так далее по аналогии }

Ответ 2



Реализуйте метод clone() в классе HeatSensor и клонируйте списки следующим образом: ArrayList celsius = new ArrayList<>(); ArrayList fareng = new ArrayList<>(); for (HeatSensor h : celsius) fareng.add(h.clone()); Ваш вариант не работает, т.к. клонируются списки, но объекты остаются одни и те же.

среда, 5 февраля 2020 г.

Сравнение ArrayList и LinkedList

#java #коллекции #arraylist #linked_list


Решил сравнить быстродействие. Написал простой пример:

public class ServiceList {
    public void addList(List list, String name){
        Date start = new Date();
        for (int i = 0; i < 4000000; i++) {
            list.add(new String());
        }
        Date finish = new Date();


        long time = finish.getTime() - start.getTime();
        //sum = sum + time;

        System.out.println("ADD "+ name + " : " + time);
    }
}


public class Main {
        public static void main(String[] args) {
            for(int i = 0; i < 10; i++) {
                new ServiceList().addList(new ArrayList(), "ArrayList");
                new ServiceList().addList(new LinkedList(), "LinkedList"); 
                System.out.println("- - - - - - - - -");

            }
        }
    }


Результаты просто удивляют:

ADD ArrayList : 1218
ADD LinkedList : 2673
- - - - - - - - -
ADD ArrayList : 156
ADD LinkedList : 187
- - - - - - - - -
ADD ArrayList : 141
ADD LinkedList : 125
- - - - - - - - -
ADD ArrayList : 141
ADD LinkedList : 297
- - - - - - - - -
ADD ArrayList : 31
ADD LinkedList : 656
- - - - - - - - -
ADD ArrayList : 188
ADD LinkedList : 32
- - - - - - - - -
ADD ArrayList : 223
ADD LinkedList : 422
- - - - - - - - -
ADD ArrayList : 31
ADD LinkedList : 1001
- - - - - - - - -
ADD ArrayList : 312
ADD LinkedList : 391
- - - - - - - - -
ADD ArrayList : 31
ADD LinkedList : 1141
- - - - - - - - -


Почему они такие разные? А порой даже linked быстрее?
    


Ответы

Ответ 1



Нет смысла сравнивать эти структуры, если нет контекста их применения. Вставки только в конец? Удаления будут? Доступ нужен к каким элементам? У вас вставка всегда в конец. Там сложность O(1) для обеих реализаций. Вот только у ArrayList ресайз происходит, если он полностью забит. А стартовый размер, если память не изменяет, равен 10. То есть, уже после десятой вставки там будет ресайз. По поводу вставки. LinkedList выигрывает, когда вставки осуществляются в середину списка. Особенно, если вы переиспользуете итератор, тогда вставка/удаление может выполняться за O(1). Обращение к элементу в ArrayList всегда за O(1). В LinkedList в худшем случае O(n). Мне почему-то кажется, что вы там больше замеряете не работу с коллекциями, а время на создание строк. А если там в промежутках stop the world у GC будет, то вообще не релевантный тест тогда. У вас тесты без прогрева. По-хорошему, до тестов нужно прогреть jvm. Использовать Date для замеров времени - ужас. Используйте System.nanoTime() или хотя бы System.currentTimeMillis(). К чему это я? Ну да, вы получили какие-то метрики, но на них не сделать никаких выводов, пока не ясен контекст использования этих структур.

вторник, 28 января 2020 г.

Рандомное перемешивание массива

#java #массивы #случайные_числа #arraylist


Есть массив в котором содержаться 4 элемента, как можно рандомно перемещать эти элементы
т.е например первый элемент стал третьим, второй четвертым итд. И так каждый раз по
разному.
    


Ответы

Ответ 1



Если вы не сильно задумываетесь о криптографической стойскости то Collections.shuffle(list);

воскресенье, 26 января 2020 г.

Многопоточность и ArrayList

#java #многопоточность #arraylist


Существует ArrayList, который в себе содержит ссылки на файлы для скачивания. Существует
метод downloadFile который может скачать эти файлы.

Кусок кода:

 for (String i : arrayList) {
     downloadFile(i);
 }


позволяет скачать все ссылки по очереди

Подскажите пожалуйста, каким образом можно запустить скачку в несколько потоков?
    


Ответы

Ответ 1



Эх, всё вам разжевать надо. А вы документацию читали? List threads = new ArrayList(); for (String s : arrayList) { final String finalS = s; // у Java замыкания слабоваты, нужна копия Thread thread = new Thread() { public void run() { downloadFile(finalS); } }; threads.add(thread); thread.start(); } for (Thread t : threads) { t.join(); } Проверка: http://ideone.com/4L6nNM

Ответ 2



Как вариант, вот такое решение: int threadCount = 10; ExecutorService executorService = Executors.newFixedThreadPool(threadCount); for (String s : arrayList) executorService.submit(() -> downloadFile(s)); executorService.shutdown(); while (executorService.isTerminated() && !Thread.currentThread().isInterrupted()) {}

Ответ 3



arrayList.parallelStream().forEach(f -> f.downloadFile(f)); выполняет в нескольких потоках и качает параллельно

Ответ 4



попробуйте библиотеку java.util.concurrent, с помощью нее можно организовать пул потоков и там некоторые вещи неплохо оптимизированы.больше о ее возможностях можно узнать тут

среда, 1 января 2020 г.

Вывести обьекты с ArrayList

#java #arraylist


ArrayList human = new ArrayList<>();
for (int i = 0; i < 100; i++)
{
    human.add(new Human(HumanName, lastName, middle_name, date, id));
}
human.forEach(System.out::println);


место полей мне выводит 100 хешкод объектов. Как сделать чтобы поля выводились объекта?
    


Ответы

Ответ 1



Нужно переопределить метод toString() в классе Human, в нем вернуть строку, которую вы ходите получить. IntelliJ IDEA умеет генерировать toString() автоматически, для этого нужно нажать Alt + Insert -> toString() и выбрать нужные поля.

Ответ 2



@katso правильно отметил что нужно для объекта переопределить метод toString(). Но удобнее использовать не автогенерацию кода intelij, а библиотеку lombok. В ней есть много аннотаций для генерации шаблоного кода(геттеры, сеттеры, конструкторы, toString, equalsAndHashCode и т.д.). Например генерация метода toString. Плюс ломбока в том, что дополнительный код он создает на этапе компиляции, то есть при добавлении новых полей в классах, ничего не нужно дополнительно приписывать.

Java ArrayList sort в ранних версиях

#java #android #сортировка #arraylist


Пытаюсь отсортировать ArrayList. Жалуется, что в api не поддерживается compare. Как
можно выполнить сортировку в более ранних версиях андроида?

Collections.sort(MyList, new Comparator() { 
    @Override
    public int compare(MyModel o1, MyModel o2) {
        return Boolean.compare(o1.isDeleted(),o2.isDeleted());
    }
});

    


Ответы

Ответ 1



Метод: public static int compare (boolean x, boolean y) класса Boolean стал доступен в API level 19. На более ранних версиях можно использовать метод: public int compareTo (Boolean b) этого же класса, который доступен начиная с API level 1. Пример: boolean b1 = true; boolean b2 = false; int result = Boolean.valueOf(b1).compareTo(b2); В Вашем случае: Collections.sort(MyList, new Comparator() { @Override public int compare(MyModel o1, MyModel o2) { return Boolean.valueOf(o1.isDeleted()).compareTo(o2.isDeleted()); } }); Или же можно написать свою реализацию сравнения, так как в данном случае это довольно просто.

Ответ 2



Collections.sort(MyList, new Comparator() { @Override public int compare(MyModel o1, MyModel o2) { return (o1.isDeleted() == o2.isDeleted()) ? 0 : (o1.isDeleted() ? 1 : -1); } });

вторник, 31 декабря 2019 г.

ArrayList как узнать индекс элемента если известно значение?

#java #android #arraylist #index


Можно ли в java узнать индекс элемента в ArrayList, если известно значение? 

При нажатии на пункт списка показывает значения

@Override
public int getItemCount() {
    return mFilteredCheeses.size();
}

public void filter(String query) {
    mFilteredCheeses = new ArrayList<>();
    for (String cheese : mDefaultCheeses) {
        if(cheese.toLowerCase().contains(query.toLowerCase())) {
            mFilteredCheeses.add(cheese);
        }
    }
    notifyDataSetChanged();
}


А есть ли возможность узнать индекс элемента, например со значением Макс?
    


Ответы

Ответ 1



Есть у ArrayList метод indexOf - он как раз ищет подходящий элемент и выводит его индекс. ArrayList test = new ArrayList<>(); test.add("yo"); test.add("yo2"); System.out.println(test.indexOf("yo2")); // Выведет: 1 Если в списке несколько одинаковых значений, то выведет индекс первого попавшегося.

Ответ 2



Смотря что Вы хотите сделать под формулировкой макс. Если это последний индекс нужного элемента то lastIndexOf(value). Можно через цикл, и там через условие то что Вам надо. напишите подробнее если это не подходит. ArrayList test = new ArrayList<>(); test.add("yo"); test.add("yo2"); test.add("yo3"); test.add("yo2"); System.out.println(test.indexOf("yo2")); System.out.println(test.lastIndexOf("yo2"));

Передать в метод arrayList

#java #arraylist


есть три arrayList:

private ArrayList clothes = new ArrayList<>();
private ArrayList computers = new ArrayList<>();
private ArrayList smartphones = new ArrayList<>();


есть switch который в зависимости от выбранного передает в метод arraList:

switch (checkInt()) {
        case 1:
            searchName(clothes);
            break;
        case 2:
            searchName(computers);
            break;
        case 3:
            searchName(smartphones);
            break;}


собственно вопрос: как метод searchName должен принимать arrayList

searchName(???????????????){
}

    


Ответы

Ответ 1



Максим, сразу бросилось в глаза, что у вас тип переменно класс, а не интерфейс. Best практика советует использовать как раз-таки интерфейс, например: private List clothes = new ArrayList<>(); private List computers = new ArrayList<>(); private List smartphones = new ArrayList<>(); Касательно Вашего вопроса, можно использовать generic методологию: public void searchName(List list) В вопросе неизвестно являются ли классы Clothes, Computer и Smartphone наследниками какого-то другого класса или интерфейса. Если бы они таки являлись, например: interface Goods { int price(); int name(); int amount(); } class Clothes implements Goods { ... } class Computer implements Goods { ... } То в таком виде код бы стал более лаконичным: Инициализация: private static List clothes = new ArrayList<>(); private static List computers = new ArrayList<>(); Наполнение: clothes.add(new Clothes()); computers.add(new Computers()); Метод остался бы унифицированным: public void searchName(List list) { for (Goods entity : list) { System.out.println(entity.price()); } } А вызов метода одинаковый для каждой из коллекций: searchName(clothes); searchName(computers); В худшем случае в варианте с generics можно будет определять какой именно объект пришел, используя instanceof оператор.

Ответ 2



Передать вот так: searchName(ArrayList objects){ } Но Вам же нужно организовать поиск в этих массивах?! Тогда вам нужно определить один интерфейс для всех этих классов. Назовем его, например Searchable. В нем опишем функцию getName(). тогда можно будет передавать в функцию параметры так: Searchable searchName(ArrayList searchableList){ for (Searchable element in searchableList){ if(element.getName() == "My some name") return element; } }

воскресенье, 29 декабря 2019 г.

Недостаточно места в ArrayList

#java #arraylist


Если при вставке новых элементов в ArrayList недостаточно места, то новая ёмкость
рассчитывается по формуле: (oldCapacity*3)/2+1
С какой целью разработчики так усложнили расчет ёмкости? Нельзя было сделать, чтобы
новая ёмкость добавлялась по одному? Спасибо.
    


Ответы

Ответ 1



Внутри ArrayList, как показывает его название, лежит обычный массив, так как Java не может гарантировать, что после массива есть свободная память, она увеличивает емкость ArrayList'а следующим образом: Создается массив с новой емкостью, под него выделяется соответствующее количество памяти, Все элементы старого массива копируются в новый, Ссылки на старый массив удаляются и память, выделенная под него, может быть удалена при следующей сборке мусора, Как вы понимаете, это все достаточно медленные действия и если выполнять при каждом добавлении элемента производительность будет плохой. С другой стороны, увеличивать емкость слишком сильно приведет к перерасходу памяти. Поэтому экспериментально подобрали именно такую формулу. Так же эта формула удобна из-за простоты целочисленного деления на 2. Если посмотреть текущую реализацию ArrayList, то там формула: int newCapacity = oldCapacity + (oldCapacity >> 1); Что очень быстро, так как это просто побайтовый сдвиг и сложение.

Ответ 2



Коэффициент получили опытным путем. Если добавлять по одному то замедлится скорость добавления новых элементов - так как на каждую вставку надо будет новый массив делать и копировать туда элементы. (Потому что после вашего массива в оперативной памяти могут идти другие данные) Очень рекомендую сделать свою версию с добавлением только на 1 элемент и замерить скорость работы на больших массивах данных.

пятница, 20 декабря 2019 г.

Как найти самую длинную строку в List?

#java #массивы #arraylist


Подскажите, пожалуйста, способ нахождения самой длинной строки в ArrayList.
    


Ответы

Ответ 1



Собссн банальный цикл и сравнение значения с предыдущем вполне спасёт: ArrayList Str = new ArrayList(); Str.add("Jim Bob"); Str.add("Bobby Jones"); Str.add("Rob Stiles"); int largestString = Str.get(0).length(); int index = 0; for(int i = 0; i < Str.size(); i++) { if(Str.get(i).length() > largestString) { largestString = Str.get(i).length(); index = i; } } System.out.println("Index " + index + " "+ Str.get(index) + " " + "is the largest and is size " + largestString); Вариант с Java8 (использовать java.util.Collections.max) String max = Collections.max(StrList, Comparator.comparing(s -> s.length())); Еще вариант с Collections, но до Java8 String max = Collections.max(Str, new Comparator() { @Override public int compare(String o1, String o2) { return o1.length() - o2.length(); } }); System.out.println(max); Collections.max - принимает на вход коллекцию (в данном случае строк) и компаратор, в котором должна быть описана логика сравнения элементов коллекции.

вторник, 9 июля 2019 г.

Как заполняется массив в ArrayList Java

Суть задачи состоит в создании ArrayList и добавлении в него обычных массивов, которые затем необходимо заполнить данными. Появился такой вопрос, каким образом заполняются массивы в ArrayList? Конкретно непонятна запись во внутреннем цикле:
for (int i = 0; i < nums.size(); i++) { for (int j = 0; jЗдесь представлен весь код метода:
public static ArrayList createList() { ArrayList nums = new ArrayList(); nums.add(new int[5]); nums.add(new int[2]); nums.add(new int[4]); nums.add(new int[7]); nums.add(new int[0]); Random r = new Random(); for (int i = 0; i < nums.size(); i++) { for (int j = 0; j

Ответ

Метод get(i) объекта nums типа ArrayList возвращает i-ый элемент списка nums, коим является объект типа int[] – массив целых чисел. Далее, во внутреннем цикле этот массив инициализируется значениями.

суббота, 22 июня 2019 г.

masm как сделать массив с изменяемой длиной

Возможно ли изменить длинну массива (dd) и затем записать её в eax?


Ответ

И нет, и да. Дело в том, что результат декларации dd - просто последовательность байт в бинарнике, которая статически грузится в память.
Так что менять размер тут просто нечему. dd не является командой динамического выделения памяти - она просто статически помещает в бинарник нужную последовательность байт.
Хотите выделить память - обратитесь к операционной системе и попросите. Через системный вызов.