아나콘다를 설치하고 주피터를 실행 중에 모듈이 없다고 나와서 파이썬 버전이 안 맞아서 그런 것이라고 생각했다. 

python --version 을 선택했을때 2점대 버전이 나왔다. 3점대를 설치했는데도 말이다. 

인터넷을 검색하다 파이션 버전을 선택할 수 있는 방법이 있었다.

일단 맥포트를 설치해야 했다.  (https://www.macports.org/install.php) (이후 터미널 재시작)

1. python_select를 설치한다. 

sudo port install python_select

2. 설치할 수 있는 파이썬을 확인한다.

port search python

3. 원하는 버전을 설치한다.

sudo port install python37

4. 파이선 3.7를 선택한다. 

sudo port select --set python python37

5. 제대로 설치가 되어있는지 확인한다. 

port select --list python

python --version

PIP

pip도 바뀐다

$ sudo port install py37-pip
$ sudo port select --set pip pip3

* 쥬피터는 그래도 모듈이 없다고 나왔다. 쥬피터에서는 다른 파이썬을 보고 있었다. 

  /Users/[계정]/anaconda3/bin 에서 실행해야 함
$ /Users/abc/anaconda/bin/python -m pip install ipykernel
$ /Users/abc/anaconda/bin/python -m  ipykernel install

웹 개발을 하다보면 리스트에서 항목 중 자식 리스트를 갖는 것을 표현하고 싶을 때 유용하게 쓸 수 있다. 

 

Course League
1코스 1부
1코스 2부
2코스 1부
2코스 2부

데이터 베이스에서 4행이 리턴된다.  1코스 = {1부, 2부} , 2코스 = {1부, 2부}

Course League
1코스 [{부=1부, 코스=1코스}, {부=2부, 코스=1코스}]
2코스 [{부=1부, 코스=2코스}, {부=2부, 코스=2코스}]

화면에서는 위와 같이 2행으로 보여주려면 어떻게 해야 할까? 

Java Stream GroupBy을 이용하여 변경할 수 있다.

 

기본 데이터 

List<Map<String, String>> list = new ArrayList<>();

Map<String, String> course1_1 = new HashMap<>();
course1_1.put("코스", "1코스");
course1_1.put("부", "1부");
Map<String, String> course2_2 = new HashMap<>();
course2_2.put("코스", "2코스");
course2_2.put("부", "2부");

Map<String, String> course2_1 = new HashMap<>();
course2_1.put("코스", "2코스");
course2_1.put("부", "1부");

Map<String, String> course1_2 = new HashMap<>();
course1_2.put("코스", "1코스");
course1_2.put("부", "2부");

list.add(course1_1);
list.add(course1_2);
list.add(course2_1);
list.add(course2_2);

Stream 에 group by  를 활용

List<Map> newList = list.stream()
  .collect(Collectors.groupingBy((map) -> map.get("코스")))
  .entrySet().stream()
  .sorted((a, b) -> b.getKey().compareTo(a.getKey()))
  .map(entry -> {
    Map map = new HashMap();
    map.put("course", entry.getKey());
    map.put("league", entry.getValue());
    return map;
  })
  .collect(Collectors.toList());

결과는 

courseAndData = {league=[{부=1부, 코스=2코스}, {부=2부, 코스=2코스}], course=2코스}
courseAndData = {league=[{부=1부, 코스=1코스}, {부=2부, 코스=1코스}], course=1코스}
computeIfAbsent​(K key, Function<? super K,​? extends V> mappingFunction)
putIfAbsent​(K key, V value)
computeIfPresent​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)
compute​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)

computeIfAbsent 와 putIfAbsent 

자바에서 맵에서 특정 키(Key)들에 항목(Value)을 넣어주고 싶은 경우가 있다. 

 

Key Value
1 KOREA
2 USA
4 JAPAN
? ?

추가되는 키가 없을 경우 함수를 호출해서 항목을 넣어줄 수 있다.

 

만약 키 값이 4 = CHINA , 5 = CANADA 를 리턴하는 함수 선언

private String getCountry(String key){
	System.out.println("@@@@@ : " + key);
	return key.equals("4") ? "CHINA" : "CANADA";
}

맵에는 1,2,3 에 대한 값만 있고, 키 리스트는 1,2,3,4,5 일 경우 

computeIfAbsent를 이용하여 4,5에 값을 넣을 수 있다.

List<String> keyList = new ArrayList<>();
keyList.add("1");
keyList.add("2");
keyList.add("3");
keyList.add("4");
keyList.add("5");

Map<String, String> map = new HashMap<>();
map.put("1", "KOREA");
map.put("2", "USA");
map.put("3", "JAPAN");

for(String s : keyList){
	map.computeIfAbsent( s, (key) -> getCountry(key) );
}

System.out.println("map = " + map);

결과는 putIfAbsent 도 동일한 결과를 보여준다

map = {1=KOREA, 2=USA, 3=JAPAN, 4=CHINA, 5=CANADA}

computeIfAbsent 와 putIfAbsent 차이

putIfAbsent는 키(Key)가 있음에도 함수를 호출함 (*단 항목을 변경하지 않음)

 

computeIfAbsent 의 결과 출력

@@@@@ : 4
@@@@@ : 5
map = {1=KOREA, 2=USA, 3=JAPAN, 4=CHINA, 5=CANADA}

putIfAbsent 의 결과 출력

@@@@@ : 1
@@@@@ : 2
@@@@@ : 3
@@@@@ : 4
@@@@@ : 5
map = {1=KOREA, 2=USA, 3=JAPAN, 4=CHINA, 5=CANADA}

computeIfPresent 와 compute

단어의 빈도 수를 체크하는 프로그램을 만들 때

어떤 단어가 몇 번 나왔는지 체크할때 유용하게 사용할 수있다.

 

text에 단어가 몇 번 나왔는지 맵에 저장, 일단 초기값은 0 이다.

String text = "KOREA KOREA USA USA USA CANADA JAPAN ";

Map<String, Integer> wordMap = new HashMap<>();

wordMap.put("KOREA", 0);
wordMap.put("USA", 0);
wordMap.put("CHINA", 0);
wordMap.put("JAPAN", 0);

 

computeIfPresent 을 이용하여 빈도 수를 계산한다.

for(String word : text.split(" ")){
	wordMap.computeIfPresent(word, (String key, Integer value) ->  ++value);
}

System.out.println("wordMap = " + wordMap);

 

결과는... 

wordMap = {USA=3, CHINA=0, JAPAN=1, KOREA=2}

computeIfPresent 와 compute 차이

위에 결과를 compute로 바꾸면 에러(NullPointerException)가 발생한다. 

CANADA가 없기 때문이다. CANADA가 없다면 결과는 동일하다. 

 

그리고 ... getOrDefault

값이 없을 때 널을 피하기 위하여 디폴트를 지정할 수 있다. 

Map<String, String> map = new HashMap<>();
map.put("1", "KOREA");
map.put("2", "USA");

System.out.println("map = " + map.getOrDefault("3", "FRANCE"));
System.out.println("map = " + map.get("3"));

결과는...

map = FRANCE
map = null
포인터의 종류 중 하나로 함수의 메모리 시작주소를 저장하는 포인터를 함수 포인터라 한다.

형식 리턴형 (*변수명)(인자...);
#include<stdio.h>
#define PI 3.1415
void Greeting();
double GetCircleArea(int);

void main(void)
{
	void (*ptr1)();
	double (*ptr2)(int);
	int radius;
	double area;

	ptr1 = &Greeting;
	(*ptr1)();

	ptr2 = &GetCircleArea;
	radius = 10;
	area = (*ptr2)(radius);
	printf("반지름이 %d인 원의 면적은 %.2f \n", radius, area);

}

void Greeting(){
	printf("Hello CodeIn!! \n");
}

double GetCircleArea(int radius){
	double area = PI*radius*radius;
	return area;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main()
{
	char* ptr1;
	char* ptr2 = "korea";
	char* ptr3 = NULL;
	ptr3 = (char *)malloc(sizeof(char)*20);

	//strcpy(ptr1, "Good Korea"); //warning 초기화하지 않고 씀 
	//strcpy(ptr2, "Good Korea"); //warning 이미 korea가 할당되어 korea가 상수이므로 
			           //korea를 수정할 수 없음 문자열 상수
	strcpy(ptr3, "Good Korea");

	printf("%s\n", ptr3);

	free(ptr3);

}

ptr2 는 "korea"가 이미 할당되어 문자열 상수를 가르키는 포인터가 된다.
문자열 상수는 내용을 고칠 수 없으므로 사용할 수 없다.

하지만
ptr2 = "hi korea";
로 바꿀 수는 있다.

int (*ptr)[3]과 int* arr[3]의 차이점은 무엇인가? 

int* arr[3] 은  포인터 배열이다. 

 변수명  저장하는 내용
arr[0]  int* 
 arr[1] int* 
 arr[2]  int*
 
int (*ptr)[3]은 배열 포인터이다.

 int a[2][3]
 a[0][0]  a[0][1]  a[0][2]
 a[1][0]  a[1][1]  a[1][2]

int a[2][3] = {{3,4,5}, {6,7,8}};
int (*ptr)[3];

ptr=a; 로 대입할 수 있다.  

포인터 배열은 포인터를 가지고 있는 배열이며 배열 포인터는 배열을 가르키는 포인터이다.
즉 끝의 단어로
포인터 배열 = 배열, 배열 포인터=포인터 이다.


 
Const는 변수 선언시 자료형 앞뒤에 사용되는 변수를 상수로 선언한다. 

즉 Const로 선언된 변수는 수정할 수 없다. 

포인터와 const 키워드 
#include<stdio.h>

void main()
{
	int a = 10;
	int b = 20;

	const int *pa = &a;
	//*pa = 20; //값을 변경할 수 없다. (Error)
	pa = &b;	//주소 변경 가능
	
	int const *pb = &b;
	pb = &a;

	int* const p = &a;
	*p = 30;
	
}
위에서 보면 const int *pa와 int const *pb은 같은 내용이다.
즉 *pb 값 포인터에 의해서 읽혀지는 값을 변경할 수 없다.
그러나 주소 변경은 가능하다. 

const int *pa = int const *pa =  const int* pa

다 같은 표현인 것이다.  

int* const p 는 다르다. 값의 변경은 가능하지만 포인터값의 p의 주소값을 수정할 수 없다.  

 
this.tlMatrixCategories.AfterCheckNode += new DevExpress.XtraTreeList.NodeEventHandler(this.tlMatrixCategories_AfterCheckNode);

private void treeList_AfterCheckNode( object sender, NodeEventArgs e )
        {
            if( e.Node.CheckState == CheckState.Indeterminate )
                e.Node.CheckState = CheckState.Checked;
            treeList.BeginUpdate();
            try
            {
                SetCheckedChildNodes( e.Node, e.Node.CheckState );
                if( e.Node.ParentNode != null )
                    SetCheckedParentNodes( e.Node.ParentNode, e.Node.CheckState );
            }
            finally
            {
                treeList.EndUpdate();
            }
        }
        private void SetCheckedChildNodes( TreeListNode node, CheckState checkState )
        {
            for( int i = 0; i < node.Nodes.Count; i++ )
            {
                node.Nodes[ i ].CheckState = checkState;
                SetCheckedChildNodes( node.Nodes[ i ], checkState );
            }
        }
        private void SetCheckedParentNodes( TreeListNode node, CheckState checkState )
        {
            bool b = false;
            for( int i = 0; i < node.Nodes.Count; i++ )
            {
                if( !checkState.Equals( node.Nodes[ i ].CheckState ) )
                {
                    b = !b;
                    break;
                }
            }
            node.CheckState = b ? CheckState.Indeterminate : checkState;
            if( node.ParentNode != null )
                SetCheckedParentNodes( node.ParentNode, checkState );
        }

+ Recent posts