Java, как перебрать 3 arrayList - PullRequest
       7

Java, как перебрать 3 arrayList

0 голосов
/ 13 сентября 2018

Я создал три ArrayList с и добавил к ним несколько значений. Затем я перебираю каждую из ArrayList s и хочу обновить значения, основываясь на условиях операторов if. Ниже приведен код, который я реализовал до сих пор, но он не дает ожидаемого результата:

List<String> columnNameList = new ArrayList<String>();
List<String> columnTypeList = new ArrayList<String>();
List<Integer> columnLengthList = new ArrayList<Integer>();

String result = "";

columnNameList.add("Id");
columnNameList.add("Name");
columnNameList.add("Address");

columnTypeList.add("char");
columnTypeList.add("varchar");
columnTypeList.add("varchar");

columnLengthList.add(18);
columnLengthList.add(50);
columnLengthList.add(10000);

outermostloop:
for (String name : columnNameList)
{
    outerloop:
    for (String type : columnTypeList)
    {
        loop:
        for (int len : columnLengthList)
        {
            if(len > 0 && (!type.equalsIgnoreCase("int") && !type.equalsIgnoreCase("datetime") && !type.equalsIgnoreCase("datetime2")))
            {
                if(len > 8000 && !(name.equalsIgnoreCase("Id")) && (type.equalsIgnoreCase("varchar")))
                {
                    result = name + " " + type + "(max) ";
                    System.out.println("if len > 8000 && name not id and type is varchar-> " + result);
                    // O/P expected : Address  varchar(max)
                }
                else
                {
                    String finalres = name + " " + type + "(" + len + ") ";
                    System.out.println("No conversion " + finalres);
                    /* O/P expected : Id char(18)
                                      Name varchar(50)
                     */
                }
            }
            break outerloop;
        }
    }
}


Обновлен код

List<String> columnNameList = new ArrayList<String>();
List<String> columnTypeList = new ArrayList<String>();
List<Integer> columnLengthList = new ArrayList<Integer>();

String result = "";

columnNameList.add("Id");
columnNameList.add("Name");
columnNameList.add("Address");

columnTypeList.add("char");
columnTypeList.add("varchar");
columnTypeList.add("varchar");

columnLengthList.add(18);
columnLengthList.add(50);
columnLengthList.add(10000);

/* outermostloop: for (String name : columnNameList) {
 *     outerloop: for (String type : columnTypeList) {
 *         loop: for (int len : columnLengthList) {
 */
for (int i = 0; i < columnNameList.size(); i++)
{
    for (i = 0; i < columnTypeList.size(); i++)
    {
        for (i = 0; i < columnLengthList.size(); i++)
        {
            if(columnLengthList.get(i) > 0 && (!columnTypeList.get(i).equalsIgnoreCase("int") && !columnTypeList.get(i).equalsIgnoreCase("datetime") && !columnTypeList.get(i).equalsIgnoreCase("datetime2")))
            {
                if(columnLengthList.get(i) > 8000 && !(columnNameList.get(i).equalsIgnoreCase("Id")) && (columnTypeList.get(i).equalsIgnoreCase("varchar")))
                {
                    result = columnNameList.get(i) + " " + columnTypeList.get(i) + "(max) ";
                    System.out.println("if len > 8000 && name not id and type is varchar " + result);
                    // O/P expected : Address  varchar(max)
                }
                else
                {
                    String finalres = columnNameList.get(i) + " " + columnTypeList.get(i) + "(" + columnLengthList.get(i) + ") ";
                    System.out.println("No conversion " + finalres);
                    /* O/P expected : Id char(18)
                                      Name varchar(50)
                    */
                }
            }
        }
    }
}

Токовый выход:

No conversion Id char(18) 
No conversion Name char(18) 
No conversion Address char(18)

Ожидаемый результат:

No conversion Id char(18) 
No conversion Name varchar(50)
if len > 8000 && name not id and type is varchar -> Address varchar(max)

Мне кажется, я что-то не так делаю с break. Может кто-нибудь, пожалуйста, дайте мне знать, что не так в текущем коде или я что-то пропустил?

1 Ответ

0 голосов
/ 13 сентября 2018

Не работает из-за структуры ваших петель. externalmostloop начинается с "Id". externalloop начинается с "char". цикл начинается с 18. Теперь ваши условия if оцениваются. После этого вы нарушаете внешнюю петлю. Теперь externalmostloop переходит к «Имя». Но externalloop начинается с начала снова, используя «char». То же самое касается цикла.

Вы можете просто заменить текущие циклы на

for(int i = 0; i < columnNameList.size(); i++){

и затем заменить:

name --> columnNameList.get(i)
type --> columnTypeList.get(i)
len --> columnLengthList.get(i)

Другой вариант - заключить все три параметра в свой собственный класс и затем выполнить итерацию по списку ArrayList этого класса. Пример:

private class Column{
    public String name;
    public String type;
    public int len;
    public Column(String name, String type, int len){
        this.name=name;
        this.type=type;
        this.len=len;
    }
}

Тогда используйте

ArrayList<Column> columns

и

columns.add(new Column("Id","Char",18));

и так далее ... Доступ заменяет

name --> column.name

при использовании петли

for(Column column: columns){
...