powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Рефакторинг
28 сообщений из 28, показаны все 2 страниц
Рефакторинг
    #38367185
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю каким еще умным словечком обозвать тему.
Ваша задача: Увидели ошибку - ткнули меня лицом в грязь. (написал код, но надо его привести к нормальному виду)
Дано: Xls файл, 0 столбец(список - далее Б) и начиная с 2 по 11 столбцы(Список списков(С) - далее А). Количество строк пока ограничено 30.
Цель: найти совпадение для каждого элемента из каждой строки А (список(С)) в векторе Б.
Алгоритм:
Сначала сортировка
сортировка А с помощью Collections.sort(List,Comparator). Comparator сравнивает длину списков.
сортировка Б - сортировка, используя ассоциативный массив, который хранит количество одинаковых элементов
сортировка С -с помощью Collection.sort

Поиск для каждого элемента из каждой строки А (список(С)) совпадения в векторе Б.
Код:
Код по абсолютной величине не большой)
Наверно основным минусом является то, что я совсем не использую принципы ООП к этой задаче.
Start(main)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
package WorkNow;


import java.util.*;

public class Start {
    public static void main(String[] args) {
        ReaderXls1Column read = new ReaderXls1Column();
        ReaderXls readrzs = new ReaderXls();
        List<String> listASU = new ArrayList<String>(read.ReaderXls1Column("Text1Import",0,1));                            // Creating Lists, reading
        List<List<String>>  listRZS = new ArrayList<List<String>>(readrzs.ReadXls("Text1Import",2,12));
        Collections.sort(listRZS, ListSizeComparator.INSTANCE);                                                          // Sort RZS
        mySort(listASU);                                                                                                 // Sort ASU
        CompareAndWrite.main("Text1Export",listRZS,listASU);                                                                // Anothers sorts and write





    }

    enum ListSizeComparator implements Comparator<List> {
        INSTANCE;

        public int compare(List one, List other) {
            return one.size() - other.size();
        }
    }

    public static List<String> mySort(List<String> asu) {
            final Map<String, Integer> counts = new HashMap<String, Integer>();
            for (String item:asu) {
                Integer count = counts.get(item);
                if (count == null) {                                                                                         // This is the first time we have seen item, so the count should be one.
                    count = 1;
                } else {                                                                                                     // Increment the count by one.
                    count = count + 1;
                }
                counts.put(item, count);
            }
            Collections.sort(asu, new Comparator<String>() {
                @Override
                public int compare(String left, String right) {
                    int countCompare = counts.get(right).compareTo(counts.get(left));
                    if(countCompare != 0) {
                        return countCompare;
                    }
                    return right.compareTo(left);
                }
            });  return asu;       }

    }


CompareAndWrite
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
package WorkNow;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;

import java.io.*;
public class CompareAndWrite {

    public static void main(String sfilename,List<List<String>> ListOfList, List<String> List) {
        List<String> listNeispZam = new ArrayList<String>();
        try {

            FileInputStream file = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls");

            //Get the workbook instance for XLS file
            HSSFWorkbook workbook = new HSSFWorkbook(file);
            CreationHelper createHelper = workbook.getCreationHelper();
            //Get first sheet from the workbook
            HSSFSheet sheet = workbook.getSheetAt(0);
            CellStyle style = workbook.createCellStyle();
            style.setFillForegroundColor(IndexedColors.LIME.getIndex());
            style.setFillPattern(CellStyle.SOLID_FOREGROUND);
            CellStyle style2 = workbook.createCellStyle();
            style2.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
            style2.setFillPattern(CellStyle.SOLID_FOREGROUND);
            CellStyle style3 = workbook.createCellStyle();
            style3.setFillForegroundColor(IndexedColors.CORAL.getIndex());
            style3.setFillPattern(CellStyle.SOLID_FOREGROUND);
            for (int i=0;i<30;i++)            {                                                                         // Очистка поля RZS
                Row row = sheet.getRow(i);
                for (int j=2;j<12;j++)     {
                    row.createCell(j).setCellValue("");  }}

            for (int i=0;i<30;i++)            {                                                                         // Очистка поля ASU
                Row row = sheet.getRow(i);
                for (int j=0;j<1;j++)     {
                    row.createCell(j).setCellValue("");  }}

            for (int i=0;i<30;i++)            {                                                                         // Очистка поля "оставшиеся"
                Row row = sheet.getRow(i);
                for (int j=13;j<14;j++)     {
                    row.createCell(j).setCellValue("");  }}

            for (int i=0;i<30;i++)            {                                                                         // Очистка поля "замены"
                Row row = sheet.getRow(i);
                for (int j=15;j<16;j++)     {
                    row.createCell(j).setCellValue("");  }}


            for (int i=0;i<List.size();i++)            {                                                                // Заполнение поля ASU
                Row row = sheet.getRow(i);
                    row.createCell(0).setCellValue(List.get(i));           }

            for (int i=0;i<ListOfList.size();i++)            {                                                          // Заполнение поля RZS
                Row row = sheet.getRow(i);
                for (int j=0;j<ListOfList.get(i).size();j++) {
                    row.createCell(2+j).setCellValue(ListOfList.get(i).get(j));    }        }


            for (int i=0;i<ListOfList.size();i++)                      {                                                // Для каждого изделия из RZS
                int count=0;
                label1:
                for (int j=0;j<ListOfList.get(i).size();j++) {                                                          // Пройдя все возможные компоненты
                    Row row = sheet.getRow(i);
                    for (int k=0;k<List.size();k++){                                                                    // Сравнивая с изделиями из ASU
                        if (List.get(k).equals(ListOfList.get(i).get(j))) {                                             // Если изделия равны
                            Row row2 = sheet.getRow(k);
                            count++;
                            if (count==1) {                                                                             // Найдено изделие (первое)
                           //     System.out.println("("+List.get(k)+") ASU <--> ("+ListOfList.get(i).get(j)+") RZS "+"String: "+i+" Column: "+j);
                                row.createCell(2+j).setCellValue(ListOfList.get(i).get(j));                             // Пометить клетку в RZS
                                row.getCell(2+j).setCellStyle(style);
                                row2.createCell(0).setCellValue(List.get(k));                                           // Пометить клетку в ASU
                                row2.getCell(0).setCellStyle(style);
                                List.remove(k); List.add(k,"founded");                                                  // Удаление из списка ASU
                                continue label1;     }
                            else if(count>1){                                                                           // Найдено еще изделие
                                row = sheet.getRow(i);
                                row.createCell(2+j).setCellValue(ListOfList.get(i).get(j));                             // Пометить клетку в RZS
                                row.getCell(2+j).setCellStyle(style3);
                                row2.createCell(0).setCellValue(List.get(k));                                           // Пометить клетку в ASU
                                row2.getCell(0).setCellStyle(style3);
                                listNeispZam.add(List.get(k));                                                          // Запись неиспользуемых изделий
                                List.remove(k); List.add(k,"another");                                                  // Удаление из списка ASU
                                continue label1;  }
                        }
                        else {
                        row.createCell(2+j).setCellValue(ListOfList.get(i).get(j));                                     // "отсутствует в АСУ"
                        row.getCell(2+j).setCellStyle(style2);

                        }
                    }
                                                             }
                                                                         }
            for (int k=0;k<List.size();k++) {
                if ((List.get(k).equals("another")) | (List.get(k).equals("founded"))) { List.remove(k); k--;  } }

            for (int i=0;i<List.size();i++)            {                                                                // Оставшиеся изделия в АСУ
                Row row = sheet.getRow(i);
                    row.createCell(13).setCellValue(List.get(i));}
            Collections.sort(listNeispZam);
            for (int i=0;i<listNeispZam.size();i++)            {                                                        // Возможные замены
                Row row = sheet.getRow(i);
                row.createCell(15).setCellValue(listNeispZam.get(i));
                row.getCell(15).setCellStyle(style3);}

            file.close();
            FileOutputStream out =
                    new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls");
            workbook.write(out);
            out.close();

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

        }
    }   }


ReadXls
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
package WorkNow;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;



public class ReaderXls {
    public List<List<String>> ReadXls(String sfilename,int firstColumn, int lastColumn){
        List<List<String>> rows = new ArrayList<List<String>>();
        List<String> columns;
        try {
            FileInputStream file = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls");
            //Get the workbook instance for XLS file
            HSSFWorkbook workbook = new HSSFWorkbook(file);
            //Get first sheet from the workbook
            HSSFSheet sheet = workbook.getSheetAt(0);
            label1:
            for (int j=0;j<30;j++)            {
                 columns = new ArrayList<String>();
                Row row = sheet.getRow(j);
                try {
                    for (int i=firstColumn;i<lastColumn;i++)     {
                        Cell cell = row.getCell(i);
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        if (cell.getStringCellValue().equals("")) {}
                        else { columns.add(cell.getStringCellValue());}
                    }

                } catch (NullPointerException e) {
                    e.printStackTrace();
                    }
                if (columns.isEmpty()) {continue label1;}
                rows.add(columns);
            }
            file.close();
            FileOutputStream out =
                    new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls");
            workbook.write(out);
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();                }
        catch (IOException e) {
            e.printStackTrace();                }
        return rows;   }

}


ReadXls1Column
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
package WorkNow;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


/**
 * Created with IntelliJ IDEA.
 * User: Eldar N.
 * Date: 09.08.13
 * Time: 9:47
 * To change this template use File | Settings | File Templates.
 */

public class ReaderXls1Column {
    public List<String> ReaderXls1Column(String sfilename,int firstColumn, int lastColumn){
        List<String> rows = new ArrayList<String>();
        String RowContent=null;
        try {
            FileInputStream file = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls");
            //Get the workbook instance for XLS file
            HSSFWorkbook workbook = new HSSFWorkbook(file);
            //Get first sheet from the workbook
            HSSFSheet sheet = workbook.getSheetAt(0);

            label1:
            for (int j=0;j<30;j++)            {
                Row row = sheet.getRow(j);
                try {
                    for (int i=firstColumn;i<lastColumn;i++)     {
                        Cell cell = row.getCell(i);
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        if (cell.getStringCellValue().equals("")) {}
                        else {RowContent=RowContent+cell.getStringCellValue();  rows.add(cell.getStringCellValue());}
                    }

                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
                if (rows.isEmpty()) {continue label1;}
            }
            file.close();
            FileOutputStream out =
                    new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls");
            workbook.write(out);
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();                }
        catch (IOException e) {
            e.printStackTrace();                }
        return rows;   }

}



The result: http://imageshack.us/photo/my-images/819/mp51.png/
http://imageshack.us/photo/my-images/841/z5c3.png/

По мимо того, что вам не понравиться, беспокоят следующий вещи:
1. Я прохожу по тройному циклу ради поиска элементов. Может легче перегнать каждый список в отдельное Множество? Но тогда будут проблемы с доступом к элементам(редактирование, удаление, добавление по позиции)
2. Сортировки используются Collection.sort, т.е. quicksort . А вот когда прохожу по тройному циклу сложность будет O(N*M*K) ? Сильно отразится такой перебор на производительности?
3. В процессе написания вопроса осознал, что зачем-то реализовал два класса для чтения, хотя казалось, что одним не обойтись
...
Рейтинг: 0 / 0
Рефакторинг
    #38367190
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не прошу проверять каждую строчку, просто посмотреть на логику и сказать, как можно было сделать иначе.
...
Рейтинг: 0 / 0
Рефакторинг
    #38367316
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaa,

Содержимое ячеек всегда числовые?
...
Рейтинг: 0 / 0
Рефакторинг
    #38367339
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока да , читаю как String, потому что в apache-poi какой-то геморрой с типом getNumericCellValue(), по задумке авторов возвращает тип Double, но и со страшной силой ругается если значение null, в отличие от getStringCellValue().
...
Рейтинг: 0 / 0
Рефакторинг
    #38367344
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offtopкак меня убивает, что нельзя сообщение отредактировать

потом идет Integer.parseInt(значения строки), все равно надо было бы преобразовывать Double => Integer
...
Рейтинг: 0 / 0
Рефакторинг
    #38367392
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала стоило причесать код согласно распространенным coding convention. Пробелы, скобки и много другое, сильно упрощают чтение кода. Причем все современные IDE умеют это делать за вас в одно-два нажатия кнопок.
А так это банальное проявление не уважения к участникам форума.

CompareAndWrite.main("Text1Export",listRZS,listASU) - неоправданое использование статического метода. Чисто процедурное программирование.

Код: java
1.
2.
3.
4.
5.
6.
enum ListSizeComparator implements Comparator<List> {
        INSTANCE;
        public int compare(List one, List other) {
            return one.size() - other.size();
        }
}


Взрыв мозга. Почему синглтон? Почему через enum? Почему List без Generic. Почему ниже создаётся анонимный компаратор, а тут такой финт ушами?

Код: java
1.
2.
3.
4.
5.
                if (count == null) {
                    count = 1; //Вот здесь производится скрытый инкремент. Эта строка зависит от того что написано ниже.
                } else {
                    count = count + 1;
                }


Логичнее было бы так
Код: java
1.
2.
3.
4.
5.
                
if (count == null) {
   count = 0;
} 
count = count + 1;


Ну, и я бы автобоксингом так шибко не увлекался.

CompareAndWrite - тихий ужас целиком и полностью. Ни о чем не говорящие имена List, ListOfList, style, style2, style3
Магические числа 30, 20, 12, 15, 13, 14, 16, 2... Почему не 25, 17, 3, 2, 1, 11, 8...? Или 22, 18, 39, 50, 100, 1...?
"founded" - find - искать. found - найден. founded - основан, установлен.
Сплошной копипаст циклов. Если вынести общий код в методы, класс можно раза в два уменьшить.
Не используется finally, что приведет к залоченым файлам.

Код: java
1.
2.
3.
catch (NullPointerException e) {
   e.printStackTrace();
}


Runtime исключение это косяки программиста, поэтому их не нужно ловить, их нужно исправлять.

Код: java
1.
2.
label1:
if (rows.isEmpty()) {continue label1;}


Это зачем вообще? Просто захотелось попробовать? Если тело условия пишется в той же строке что и условие, то скобки, обычно не ставят. Но если тело переносится на следующую строку, то скобки нужны обязательно.

В общем, тут и без рефакторинга ещё причесывать и причесывать.
...
Рейтинг: 0 / 0
Рефакторинг
    #38367454
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, +1

Мне лично стало лень читать исходники когда увидел как они отформатированы..)

По поводу фигурных скобок только не всё однозначно.. NetBeans при форматировании кода их автоматически подставляет (и в общем я это поддерживаю).
А каждый раз их удалять когда хочется сделать код компактней - думаю не очень хорошая идея..

P.S. Спойлеры - это хорошо.
...
Рейтинг: 0 / 0
Рефакторинг
    #38367457
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Рефакторинг
    #38367574
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, аккуратней, так и до deadlock топиков не далеко )
Принял всё к сведению и, конечно, исправлю всё. Ошибок не делает тот, кто ничего не делает.
Blazkowicz Взрыв мозга. Почему синглтон? Почему через enum? Почему List без Generic.
:( Я не знаю. Компаратор с объектами я так и не въехал пока. Его мне посоветовали на переполненном стеке.
(By the way, I've used an enum for the enum singleton pattern because our Comparator stores no state.)
А то что в нем, невозможно объявить Гинерик, тоже нечего ответить. Я пытался добавить, но тогда Компаратор ругается.
-------------------------
...
Рейтинг: 0 / 0
Рефакторинг
    #38367592
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaa:( Я не знаю. Компаратор с объектами я так и не въехал пока. Его мне посоветовали на переполненном стеке.

А вот это
Код: java
1.
2.
3.
new Comparator<String>() {
                @Override
                public int compare(String left, String right) {


можно подумать компаратор без объектов?


(By the way, I've used an enum for the enum singleton pattern because our Comparator stores no state.)
Гениально. Давайте все классы, которые не имеют состояния, делать enum-синглтонами.


eldarkaaА то что в нем, невозможно объявить Гинерик, тоже нечего ответить. Я пытался добавить, но тогда Компаратор ругается.

В текущей реализации компилятор должен выдавать предупреждения. Должно быть хотя бы так
Код: java
1.
2.
implements Comparator<List<?>> {
        public int compare(List<?> one, List<?> other) {


Могу и ошибаться.
...
Рейтинг: 0 / 0
Рефакторинг
    #38367618
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaaUsman, аккуратней, так и до deadlock топиков не далеко )eldarkaa Дано: Xls файл...Можете приаттачить свой XLS-файл? (пусть даже тестовый)
...
Рейтинг: 0 / 0
Рефакторинг
    #38367629
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, Скучно стало? На основе его создадите просто с другим названием (Text1Export.xls).
Еще библиотеку apache-poi придется скачать, если вы правда хотите запустить. Может JAR кинуть в котором все? Только там я не знаю, как изменить абсолютную директорию, куда сохраняется файл)
Blazkowicz, сейчас добавил в Компаратор Гинерик и сверху тоже, тогда стало возможным к переменным добавлять Гинерик. Так же как вы написали..
Blazkowiczimplements Comparator<List<?>> {
public int compare(List<?> one, List<?> other) {
Компаратор с объектами, я имел ввиду сложные объекты (коллекции). Он не такой простой как переопределенный родительский.
Потребовался сингтон шаблон еще, а для меня это темный лес, вот к чему я.
...
Рейтинг: 0 / 0
Рефакторинг
    #38367632
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
синглтон * (singleton)
...
Рейтинг: 0 / 0
Рефакторинг
    #38367709
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaa,

String это такой же объект как и List. Компаратор для String реализован по старинк через анонимный класс. А вот совершенно анологичный компаратор для List почему-то вдруг стал enum синглтоном. Это читаемости коду не добавляет. А только добавляет удивления. Я бы убрал.
...
Рейтинг: 0 / 0
Рефакторинг
    #38367720
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaaКоличество строк пока ограничено 30.Максимально сколько может быть?
...
Рейтинг: 0 / 0
Рефакторинг
    #38367726
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
около двух тысяч +- "тыща"
...
Рейтинг: 0 / 0
Рефакторинг
    #38367817
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, есть идеи?
...
Рейтинг: 0 / 0
Рефакторинг
    #38367841
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaa, какие тебе еще идеи? Ты объединение циклов сделай. В глазах ведь рябит. Потом версию выкладывай.
Будем дальше смотреть. Рефакторинги появляются последовательно. Одно сделал - следом появляется другое.

За деревьями не видно леса (с).
...
Рейтинг: 0 / 0
Рефакторинг
    #38367918
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaa,

У каждого "однотипного" изделия (элемента) может быть уникальное поле (типа ID/серийник)?
Как вы заполняете столбец P?
...
Рейтинг: 0 / 0
Рефакторинг
    #38368043
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 строчка(со 2-го по 11-ый столбец) это Компонент, у него может быть 10 изделий (замен) (они же 10 колонок)
Может ли быть у Компонента ID? - В данной реализации нет.
Столбец Р . Возможная замена(изделие). Значит, если нашлась замена(изделие), которое содержится в РЗС(2-11 столбцы) и в АСУ(1 столбец), то она отмечается как Используемая. Все другие, которые можно использовать помечаются Возможными.
Есть ли приоритет? Приоритет только по количеству замен(изделий) в АСУ, поэтому АСУ отсортирован по количеству. Много изделий - уходят первыми и так далее. Сначала ищутся по РЗС(2-11столбцы), в которых мало замен, потом по нарастающей.
Пока в АСУ возможные блокируют места, но на самом деле они только возможные. Это можно сделать если убрать
# удаление из списка элементов и последующего добавления "another" #
Код: java
1.
List.remove(k); List.add(k,"another");   


и подкраску цветом тоже
----- Оффтоп. Пока так не надо делать.
По хорошему счету надо создавать Сущность для таблица РЗС (с 2 по 11 колонку). Если ее создавать то появится айди, но появятся сложности с вытаскиванием и модифицированием значений, а так же обрежутся вкусные функции от Коллекции. Возможно тут на помощь должен прийти ООП с его наследованием, но я еще дуб) + это пока не востребовано.
------------------------------------
Вечерком переделаю и сделаю новый топик или этот апну.
...
Рейтинг: 0 / 0
Рефакторинг
    #38368812
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал чтение из файла, чтобы можно было зачитать все за 1 раз) и тут я вспомнил, почему мне потребовалось 2класса)
Ведь получать из метода можно только 1 параметр)
Ну вот теперь искать информацию по получению нескольких параметров из метода.
Что-то пока не получается... Добавил новый класс, для хранения. Но опять те же грабли, что и были раньше.
Blackwitz уже помогал мне с логикой хранения, когда создавали класс запись и ее хранили в классе хранилище.
-----------------------
Start
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Start {
    public static void main(String[] args) {
        ReaderXls read = new ReaderXls();
        read.ReadXls("Text1Import",0,12);
        DataFromReader data = new DataFromReader();
        List<String> listAsu = new ArrayList<String>(data.rowsAsu);                                                     // Creating ListsAsu
        List<List<String>>  listRzs = new ArrayList<List<String>>(data.rowsRzs);                                                   // Creating ListOfListRzs
        Collections.sort(listRzs, ListSizeComparator.INSTANCE);                                                          // Sort RZS
        mySort(listAsu);                                                                                                 // Sort ASU
        CompareAndWrite.main("Text1Export",listRzs,listAsu);                                                                // Anothers sorts and write
    }


ReaderXls
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  public DataFromReader ReadXls(String sfilename,int firstColumn, int lastColumn){
        DataFromReader data = new DataFromReader();
        List<List<String>> rowsRzs = new ArrayList<List<String>>();
        List<String> rowsAsu = new ArrayList<String>();
        List<String> columnsRzs;
        FileInputStream fileInputStream = null;
        HSSFWorkbook workBook = null;
        try {
.................
 data.storeData(rowsRzs,rowsAsu);  
 return data;  }


DataFromReader
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package workhere;

import java.util.List;

public class DataFromReader {
    List<List<String>> rowsRzs;
    List<String> rowsAsu;
    public DataFromReader(){

    }
    public void storeData(List<List<String>> newRowsRzs, List<String> newRowsAsu){
        this.rowsRzs=newRowsRzs;
        this.rowsAsu=newRowsAsu;
    }

    public List<List<String>> getRowsRzs() {
        return rowsRzs;
    }

    public List<String> getRowsAsu() {
        return rowsAsu;
    }
}


Данные не передаются из ReadXls в Start. (Скорее передаются, но затираются новым экземпляром класса(DataFromReader) в Start.
Какой-то косяк в том, что объекты статические или нет. До CompareAndWrite еще не дошел.
...
Рейтинг: 0 / 0
Рефакторинг
    #38368838
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaa,
Ведь получать из метода можно только 1 параметр)
Ну вот теперь искать информацию по получению нескольких параметров из метода. Этот один возвращаемый результат может быть чем угодно, в том числе коллекцией.
...
Рейтинг: 0 / 0
Рефакторинг
    #38368861
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaaнескольких параметров из методаМожно еще перегрузить метод
...
Рейтинг: 0 / 0
Рефакторинг
    #38368869
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsmanМожно еще перегрузить метод
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public static List<List<String>> getRange(int row, int col, int rowsCount, int colsCount) {
	List<List<String>> result = new ArrayList<>();
	// TODO: для "прямоугольной" области
	return result;
}

public static List<String> getRange(int row, int col, int rowsCount) {
	List<String> result = new ArrayList<>();
	// TODO: для одного столбца
	return result;
}

P.S.
Почему не на VBA ?
...
Рейтинг: 0 / 0
Рефакторинг
    #38369252
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что Java! Excel выступает в роли GUI) Думаю перепилить на SWING, но пока не хватает смелости и знаний.
Версия 2.0.x.d
Гоу рефакторинг?)
Код стал поменьше, но думаю переборщил с переопределением writer в CompareAndWrite.
Почему в CompareAndWrite опять непонятные числа ? 0-2-15? Это все входные данные, которые указывали бы с какого столбца начинать. По-прежнему присутствует магия чисел из-за отсутствия нормальных входных данных.
Start(main)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
package workhere;

import java.util.*;
import java.util.Comparator;

public class Start {
    public static void main(String[] args) {
        ReaderXls read = new ReaderXls();
        List<String> listAsu = new ArrayList<String>(read.ReadXls("Text1Import",0,30));                                 // Creating Lists, reading
        System.err.println(listAsu);
        List<List<String>>  listRzs = new ArrayList<List<String>>(read.ReadXls("Text1Import",2,10,30));
        System.err.println(listRzs);
        Collections.sort(listRzs,new SizeComparator());                                                                 // Sort RZS
        SortAsu(listAsu);                                                                                               // Sort ASU
        System.err.println(listAsu);
        System.err.println(listRzs);
        new CompareAndWrite("Text1Export",listRzs,listAsu,30);                                                             // Anothers sorts and write
    }



    private static List<String> SortAsu(List<String> asu) {
        final Map<String, Integer> counts = new HashMap<String, Integer>();
        for (String item:asu) {
            Integer count = counts.get(item);
            if (count == null) {                                                                                      
                count = 0;
            } else {                                                                                                     // Increment the count by one.
                count = count + 1;
            }
            counts.put(item, count);
        }
        Collections.sort(asu, new Comparator<String>() {
            @Override
            public int compare(String left, String right) {
                int countCompare = counts.get(right).compareTo(counts.get(left));
                if (countCompare != 0) {
                    return countCompare;
                }
                return right.compareTo(left);
            }
        });  return asu; }
    }


ReadXls
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
package workhere;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

public class ReaderXls {
    public List<List<String>> ReadXls(String sfilename,int firstColumn, int columnsCount, int rowsCount){
        int lastColumn=firstColumn+columnsCount;
        List<List<String>> rowsRzs = new ArrayList<List<String>>();
        List<String> columnsRzs;
        FileInputStream fileInputStream = null;
        HSSFWorkbook workBook = null;
        try {
            fileInputStream = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls");
            workBook = new HSSFWorkbook(fileInputStream);                                                               //Get the workbook instance for XLS file
            HSSFSheet sheet = workBook.getSheetAt(0);                                                                   //Get first sheet from the workbook
            toNewLine:
            for (int lineId=0;lineId<rowsCount;lineId++)            {
                columnsRzs = new ArrayList<String>();
                Row row = sheet.getRow(lineId);
                try {
                    for (int columnId=firstColumn;columnId<lastColumn;columnId++)     {
                        Cell cell = row.getCell(columnId);
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        if (cell.getStringCellValue().equals("")) {}
                        else columnsRzs.add(cell.getStringCellValue());
                    }
                }
                catch (NullPointerException e) {
                    e.printStackTrace();
                }
                if (columnsRzs.isEmpty()) {
                    continue toNewLine;
                }
                rowsRzs.add(columnsRzs);
            }
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();                 }
        catch (IOException e) {
            e.printStackTrace();                 }
        finally {
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                    FileOutputStream out =
                            new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls");
                    workBook.write(out);
                    out.close();
                }
            }
            catch (IOException e) {  e.printStackTrace();}
        }
         return rowsRzs;   }
    public List<String> ReadXls(String sfilename,int firstColumn, int rowsCount){
        List<String> rowsAsu = new ArrayList<String>();
        FileInputStream fileInputStream = null;
        HSSFWorkbook workBook = null;
        try {
            fileInputStream = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls");
            workBook = new HSSFWorkbook(fileInputStream);                                                               //Get the workbook instance for XLS file
            HSSFSheet sheet = workBook.getSheetAt(0);                                                                   //Get first sheet from the workbook
            toNewLine:
            for (int lineId=0;lineId<rowsCount;lineId++)            {
                Row row = sheet.getRow(lineId);
                try {
                    for (int columnId=firstColumn;;)     {
                        Cell cell = row.getCell(columnId);
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        if (cell.getStringCellValue().equals("")) {
                            continue toNewLine;
                        }
                        else {
                            rowsAsu.add(cell.getStringCellValue()); continue toNewLine;
                        }
                    }
                }
                catch (NullPointerException e) {
                    e.printStackTrace();
                }

            }
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();                 }
        catch (IOException e) {
            e.printStackTrace();                 }
        finally {
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                    FileOutputStream out =
                            new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls");
                    workBook.write(out);
                    out.close();
                }
            }
            catch (IOException e) {  e.printStackTrace();}
        }
        return rowsAsu;   }

}


CompareAndWrite
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
package workhere;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.*;

public class CompareAndWrite {
    FileInputStream fileInputStream = null;
    HSSFWorkbook workBook;
    public CompareAndWrite(String sfilename,List<List<String>> listRzs, List<String> listAsu, Integer rowsCount) {
        List<String> listOfUnusedReplacement = new ArrayList<String>();
        try {
            fileInputStream = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls");
            workBook = new HSSFWorkbook(fileInputStream);
            HSSFSheet sheet = workBook.getSheetAt(0);
            CellStyle styleLimeColor = newCellStyle("Green");
            CellStyle styleGrey25Color = newCellStyle("Grey");
            CellStyle styleCoralColor= newCellStyle("Coral");
            cleaner();
            writer(0,0,listAsu);                                                                                         // Заполнение поля ASU
            writer(0,2,0,listRzs);                                                                                       // Заполнение поля RZS


            for (int lineRzs=0;lineRzs<listRzs.size();lineRzs++)                      {                                  // Для каждого изделия из RZS
                int coincidence=0;
                toColumns:
                for (int columnRzs=0;columnRzs<listRzs.get(lineRzs).size();columnRzs++) {                                // Пройдя все возможные компоненты
                    Row row = sheet.getRow(lineRzs);
                    for (int elementsAsu=0;elementsAsu<listAsu.size();elementsAsu++){                                    // Сравнивая с изделиями из ASU
                        if (listAsu.get(elementsAsu).equals(listRzs.get(lineRzs).get(columnRzs))) {                      // Если изделия равны
                            Row row2 = sheet.getRow(elementsAsu);
                            coincidence++;
                            if (coincidence==1) {                                                                        // Найдено изделие (первое)
                                row.createCell(2+columnRzs).setCellValue(listRzs.get(lineRzs).get(columnRzs));           // Пометить клетку в RZS
                                row.getCell(2+columnRzs).setCellStyle(styleLimeColor);
                                row2.createCell(0).setCellValue(listAsu.get(elementsAsu));                               // Пометить клетку в ASU
                                row2.getCell(0).setCellStyle(styleLimeColor);
                                listAsu.remove(elementsAsu); listAsu.add(elementsAsu,"found");                           // Удаление из списка ASU
                                continue toColumns;     }
                            else if(coincidence>1){                                                                      // Найдено еще изделие
                                row = sheet.getRow(lineRzs);
                                row.createCell(2+columnRzs).setCellValue(listRzs.get(lineRzs).get(columnRzs));           // Пометить клетку в RZS
                                row.getCell(2+columnRzs).setCellStyle(styleCoralColor);
                                row2.createCell(0).setCellValue(listAsu.get(elementsAsu));                               // Пометить клетку в ASU
                                row2.getCell(0).setCellStyle(styleCoralColor);
                                listOfUnusedReplacement.add(listAsu.get(elementsAsu));                                   // Запись неиспользуемых изделий
                                listAsu.remove(elementsAsu); listAsu.add(elementsAsu,"another");                         // Удаление из списка ASU
                                continue toColumns;  }
                        }
                        else {
                        row.createCell(2+columnRzs).setCellValue(listRzs.get(lineRzs).get(columnRzs));                   // "отсутствует в АСУ"
                        row.getCell(2+columnRzs).setCellStyle(styleGrey25Color);
                        }
                    }
                }
            }
            sortAsu(listAsu);                                                                                           // Сортировка оставшихся АСУ
            writer(13, 0, listAsu);                                                                                     // Оставшиеся изделия в АСУ - 13 столбец
            Collections.sort(listOfUnusedReplacement);                                                                  // Сортировка возможных замен
            writer(15,0,listOfUnusedReplacement,styleCoralColor);                                                       // Окраска в Coral цвет, возможных замен  - 15 столбец

        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                    FileOutputStream out =
                            new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls");
                    workBook.write(out);
                    out.close();
                }
            }
            catch (IOException e) {  e.printStackTrace();}
        }

    }
    public CellStyle newCellStyle(String color){
        CellStyle style = workBook.createCellStyle();
        if (color=="Green") {
        style.setFillForegroundColor(IndexedColors.LIME.getIndex());
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);  }
        if (color=="Grey") {
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);  }
        if (color=="Coral") {
        style.setFillForegroundColor(IndexedColors.CORAL.getIndex());
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);   }
        return style;
    }
    private void writer(Integer firstColumn, Integer columnsCount, Integer rowsCount, Object object){
        HSSFSheet sheet = workBook.getSheetAt(0);
        int lastColumn=firstColumn+columnsCount;
        for (int lineId=0;lineId<rowsCount;lineId++)   {
        Row row = sheet.getRow(lineId);
            for (int columnId=firstColumn;columnId<lastColumn;columnId++){
                row.createCell(columnId).setCellValue(object.toString());
            }
        }

    }
    private void writer(Integer firstColumn, Integer firstRow, List<String> listAsu){
        HSSFSheet sheet = workBook.getSheetAt(0);
        for (int lineId=firstRow;lineId<listAsu.size();lineId++)   {
            Row row = sheet.getRow(lineId);
             row.createCell(firstColumn).setCellValue(listAsu.get(lineId));
        }
    }
    private void writer(Integer firstColumn, Integer firstRow, List<String> listUnused, CellStyle style){
        HSSFSheet sheet = workBook.getSheetAt(0);
        for (int lineId=firstRow;lineId<listUnused.size();lineId++)   {
            Row row = sheet.getRow(lineId);
            row.createCell(firstColumn).setCellValue(listUnused.get(lineId));
            row.getCell(firstColumn).setCellStyle(style);
        }
    }
    private void writer(Integer firstColumn, Integer columnIndent, Integer firstRow, List<List<String>> list){
        HSSFSheet sheet = workBook.getSheetAt(0);
        for (int lineId=firstRow;lineId<list.size();lineId++)   {
             Row row = sheet.getRow(lineId);
            for (int columndId=firstColumn;columndId<list.get(lineId).size();columndId++)
            row.createCell(columnIndent+columndId).setCellValue(list.get(lineId).get(columndId));
        }
    }

    private void cleaner(){
        // Очистка ASU
        writer(0,1,30,"");
        // Очистка RZS
        writer(2,10,30,"");
        // Очистка ASU "оставшиеся"
        writer(13,1,30,"");
        // Очистка ASU "возможные"
        writer(15,1,30,"");
    }
    private List<String> sortAsu(List<String> listAsu){
    for (int k=0;k<listAsu.size();k++) {
        if ((listAsu.get(k).equals("another")) | (listAsu.get(k).equals("found"))) { listAsu.remove(k); k--;  }
    }
        return listAsu;
    }

}


SizeComparatorpackage workhere;

import java.util.Comparator;
import java.util.List;

public class SizeComparator implements Comparator<List<String>> {
public int compare(List <String> one, List<String> other) {
return one.size() - other.size();
}
}

* В ReadXls много исключений из-за FileInputStream, HSSFWorkBook и из-за него - cell.setCellType(Cell.CELL_TYPE_STRING);
Это не правильно выводить исключения на экран и никак не реагировать, но FileInputStream точно выдавать будет исключение, если файла не будет, а другие двое - странные совсем..


Беспокоят следующий вещи:
1. Я прохожу по тройному циклу ради поиска элементов. Может легче перегнать каждый список в отдельное Множество? Но тогда будут проблемы с доступом к элементам(редактирование, удаление, добавление по позиции)
2. Сортировки используются Collection.sort, т.е. quicksort . А вот когда прохожу по тройному циклу сложность будет O(N*M*K) ? Сильно отразится такой перебор на производительности?
...
Рейтинг: 0 / 0
Рефакторинг
    #38369406
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaaМожет легче перегнать каждый список в отдельное Множество?Если Вам нужно выполнить пересечение списков, тогда нет необходимости перегонять все в отдельное множество:
Код: java
1.
2.
3.
4.
5.
6.
List<String> asu = new ArrayList<>();
List<List<String>> rzs = new ArrayList<>();
...
for (List<String> row : rzs) {
	row.retainAll(asu);
}


И результат:
rzs = [[150, 151, 167, 153, 154, 155, 156, 157, 158, 159], [161, 162, 167, 164, 165, 166, 263, 168, 169, 170], [172, 230, 59, 175, 176, 177, 274, 179, 180, 181], [183, 241, 58, 186, 187, 11, 285, 190, 191, 192], [194, 252, 57, 197, 198, 11, 296, 201, 202, 203], [205, 263, 56, 208, 209, 11, 307, 212, 213, 214], [216, 217, 55, 219, 220, 11, 222, 223, 224, 225], [227, 228, 54, 230, 231, 11, 233, 234, 235, 236], [238, 239, 53, 241, 242, 11, 244, 245, 246, 247], [249, 250, 52, 252, 253, 22, 255, 256, 257, 258], [260, 261, 51, 263, 264, 22, 266, 267, 268, 269], [271, 272, 50, 274, 275, 22, 277, 278, 279, 280], [282, 283, 49, 285, 286, 22, 288, 289, 290, 291], [293, 294, 295, 296, 297, 22, 299, 300, 301, 302], [304, 305, 306, 307, 308, 33, 310, 311, 312, 313], [315, 316, 317, 318, 319, 33, 321, 322, 323, 324], [189, 228, 132, 33], [186, 187, 189, 33], [197, 198, 189, 44], [208, 209, 189, 200, 44], [219, 220, 156], [230, 231, 156], [241, 242], [252, 253], [263, 264], [274, 275], [285, 286], [296, 297], [307, 308], [318, 319]]

asu = [11, 11, 11, 11, 11, 11, 11, 22, 22, 22, 22, 22, 33, 33, 33, 33, 44, 44, 44, 55, 55, 230, 241, 252, 263, 274, 285, 296, 307, 318]
=
[[], [263], [230, 274], [241, 11, 285], [252, 11, 296], [263, 11, 307], [55, 11], [230, 11], [241, 11], [252, 22], [263, 22], [274, 22], [285, 22], [296, 22], [307, 33], [318, 33], [33], [33], [44], [44], [], [230], [241], [252], [263], [274], [285], [296], [307], [318]]
...
Рейтинг: 0 / 0
Рефакторинг
    #38369464
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, спасибо за ответ. Но речь немного не о том.
Нормально ли искать элемент по всем строчкам и по всем столбцам? Просто если будет для каждого элемента из списка списков, который содержит 2000 строк и 10 столбцов, проходить еще и вектор(в нашем случае список Asu) ради определения совпадения. Это слишком накладно.
Я Множества в качестве примера привел, то что в них легко можно найти одинаковые элементы.
Если содержится строка(множества) в другом множестве, то искать элемент. Хотя и так не получится, готовой реализации нету, в которой проверяется не все множество, а его элементы, а если делать свою, то получится тоже банальное сравнение каждого с каждым.
+ С множествами не особо поработаешь. Удалит дубликаты, да и единственное полезное что может сделать - найти замены(элементы, изделия) который не содержатся ни в одном из списков.
--------------
Иными словами. Есть замена циклу O(N*M*K) ? (а то это ультра не круто)
...
Рейтинг: 0 / 0
Рефакторинг
    #38369483
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaaЕсть замена циклу O(N*M*K) ? (а то это ультра не круто)Нужно индексировать значения ячеек и их отсортированных позиций в виде дерева (дополнительная структура):
Код: java
1.
Map<String, List<java.awt.Point>> = new HashMap<>();

Индексировать при считывании из файла (импорт).
Так мы сможем быстро найти нужный компонент и его расположение.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Рефакторинг
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]