본문 바로가기

재개발

List와 Map 가지고 놀기

List와 Map의 콜라보.

void main() {

  List<Map<String, String>> resolution =[
    {
      'column' : '3840',
      'row' : '2160',
      
    },
    {'column' : '1920',
      'row' : '1080',
    }
  ];
  
  var fourK = resolution[0];
  var twoK = resolution[1];
  
  print(fourK.runtimeType);
  print(fourK);
  print(twoK);
  
}

결과
JsLinkedHashMap<String, String>
{column: 3840, row: 2160}
{column: 1920, row: 1080}

 

오래전 쓰던 배열과 구조체와 비슷하지만 쓰는 방법이 달라서 머리에 안들어옴. ㅠㅠ

void main() {
List<Map<String, dynamic>> resolution =[
        {
       "name" : 'fourK',
      "column" : 3840,
       "row" : 2160     
    },
    {
       "name" : 'twoK',
      "column" : 1920,
       "row" : 1080
    }
  ];
  
  for(var res in resolution){
    print(res["name"]);
  }
  
  for(var res=0; res<resolution.length; res++){
    print(resolution[res]["name"]);
  }
  
  print(resolution.first);
  print(resolution.first["name"]);
  print(resolution[0]["name"]);
  
}

결과는
fourK
twoK
fourK
twoK
{name: fourK, column: 3840, row: 2160}
fourK
fourK

나주에 드롭박스로 선택한 이름에 따라 각 변수 세팅하려면 일단 for loop 돌려야 하는데,

void main() {

  String modelName;
  double modelColumn;
  double modelRow;
  String modelSelect;
  
  List<Map<String, dynamic>> resolution =[
        {
       "name" : 'fourK',
      "column" : 3840,
       "row" : 2160     
    },
    {
       "name" : 'twoK',
      "column" : 1920,
       "row" : 1080
    }
  ];
  
  for(var res in resolution){
    print(res["name"]);
  }
  
  for(var res=0; res<resolution.length; res++){
    print(resolution[res]["name"]);
  }
  
  print(resolution.first);
  print(resolution[0]["name"]);
  
  
modelSelect = 'twoK';
  // name을 하나 선택하면 각 변수에 Map의 값을 할당하는 방법
  for(var res in resolution){
    if(res["name"] == modelSelect){
      modelName = modelSelect;
      modelColumn = res["column"];
      modelRow = res["row"];
      print('Model Name : $modelName, column is $modelColumn, row is $modelRow');
    }
  }
// for문을 돌리지 않고 가능한지?
}

// 결과
fourK
twoK
fourK
twoK
{name: fourK, column: 3840, row: 2160}
fourK
Model Name : twoK, column is 1920, row is 1080

 

for문을 안돌리고 하는 방법이 없을까?

하드웨어 하는 사람들은 쓸데없이 이런거 생각 함. ㅠㅠ

순서가 일정하니 Map이 굳이 필요없어 보여 List만 가지고 구현.

class ModelInfo{
  String modelName="";
  double modelColumn=0;
  double modelRow=0;
  
  ModelInfo(this.modelName, this.modelColumn, this.modelRow);
  
  @override
  String toString(){
    return 'Model Name : $modelName, column is $modelColumn, row is $modelRow';
      
  }
}

void findUsingLoop(List<ModelInfo> model, String modelSelect){
final stopwatch = Stopwatch()..start();
  //   for(var i in model){
  for(var i = 0; i<model.length; i++){
    if(model[i].modelName == modelSelect){
      print('Using Loop:\n ${model[i]}');
      print('${stopwatch.elapsed}');
      return;
    }
  }
  
}

void findUsingFirstWhere(List<ModelInfo> model, String modelSelect){
final stopwatch = Stopwatch()..start();
final foundModel = model.firstWhere((element) =>
       element.modelName == modelSelect,
//         orElse:(){return null}
);
  print('Using FirstWhere:\n $foundModel');
  print('${stopwatch.elapsed}');
}

void findUsingSingleWhere(List<ModelInfo> model, String modelSelect){
final stopwatch = Stopwatch()..start();
final foundModel = model.singleWhere((element) =>
       element.modelName == modelSelect,
//         orElse:(){return null}
);
  print('Using SingleWhere:\n $foundModel');
  print('${stopwatch.elapsed}');
}

void findUsingWhere(List<ModelInfo> model, String modelSelect){
final stopwatch = Stopwatch()..start();
final foundModel = model.where((element) =>
       element.modelName == modelSelect,

);
  if(foundModel.isNotEmpty){
  print('Using Where:\n ${foundModel.first}');
  print('Using Where:\n $foundModel');
  print('${stopwatch.elapsed}');
  }
}


void findUsingRetainWhere(List<ModelInfo> model, String modelSelect){
Stopwatch stopwatch = new Stopwatch()..start();
  model.retainWhere((element) =>
       element.modelName == modelSelect,
);
  if(model.isNotEmpty){
  print('Using RetainWhere:\n ${model[0]}');
  print('Using RetainWhere:\n $model');
  print('${stopwatch.elapsed}');
  }
}


void main() {  
  
final model = [
  ModelInfo('fourK', 3840, 2160),
    ModelInfo('twoK', 1920, 1080),
  ];
          
final modelSelect = 'twoK';

  findUsingLoop(model, modelSelect);
  findUsingFirstWhere(model, modelSelect);
  findUsingSingleWhere(model, modelSelect);
  findUsingWhere(model, modelSelect);
  findUsingRetainWhere(model, modelSelect);  
}


// 결과
Using Loop:
 Model Name : twoK, column is 1920, row is 1080
0:00:00.000000
Using FirstWhere:
 Model Name : twoK, column is 1920, row is 1080
0:00:00.000200
Using SingleWhere:
 Model Name : twoK, column is 1920, row is 1080
0:00:00.000101
Using Where:
 Model Name : twoK, column is 1920, row is 1080
Using Where:
 (Model Name : twoK, column is 1920, row is 1080)
0:00:00.000100
Using RetainWhere:
 Model Name : twoK, column is 1920, row is 1080
Using RetainWhere:
 [Model Name : twoK, column is 1920, row is 1080]
0:00:00.000000

List의 내용을 열몇개로 늘려봐도 (내가 사용하는 정도)

빠른 순서도 왔다갔다 하고, 뭐 크게 차이가 나는게 없다.

for 루프 써도 됨.

'재개발' 카테고리의 다른 글

출시 1차시도 실패. ㅋ  (1) 2023.01.07
List, Map 조금 더  (0) 2023.01.05
iOS 테스트 후 출시  (0) 2023.01.01
안드로이드 테스트 후 출시  (0) 2023.01.01
이쯤에서 코드 리펙토링  (0) 2022.12.31