다크호스 프로그래머 - 학습 일기 [10] [범 형, 맵 과 Collections]
Set: 무질서, 중복 불가 |--HashSet: 데이터 구 조 는 해시 표 이 고 스 레 드 는 동기 화 되 지 않 습 니 다. 원소 의 유일 성 을 확보 하 는 원리: 원소 의 hashCode 값 이 같 는 지 판단 합 니 다.같 으 면 원소 의 equals 방법 이 true 인지 아 닌 지 계속 판단 합 니 다.
|--TreeSet: Set 집합 에 있 는 요 소 를 정렬 할 수 있 습 니 다. 바 텀 데이터 구 조 는 이 진 트 리 입 니 다. 요소 의 유일 성 을 확보 하 는 근거: compare To 방법 return 0. HashSet 만 해시 값 을 연결 합 니 다. TreeSet 은 이 진 트 리 를 갑 니 다.TreeSet 은 compare To 방법 을 통 해 요소 가 같은 지 확인 합 니 다. TreeSet 집합 에서 요 소 를 삭제 하거나 요소 가 포함 되 어 있 는 지 판단 하려 면 CompareTo 방법 return 0 을 가 야 합 니 다. 0 을 되 돌려 주면 요소 가 같다 고 생각 합 니 다.
TreeSet 정렬 의 첫 번 째 방식: 요소 자체 가 비교 성 을 가지 도록 합 니 다. 요 소 는 Comparable 인 터 페 이 스 를 실현 하고 compare To 방법 을 덮어 써 야 합 니 다.이런 방식 은 원소 의 자연 순서 라 고도 부 르 거나 기본 순서 라 고도 부른다.
TreeSet 의 두 번 째 정렬 방식 원소 자체 가 비교 성 을 갖 추 지 못 하거나 갖 추 는 비교 성 이 필요 하지 않 을 때 집합 자체 가 비교 성 을 갖 도록 해 야 한다. 집합 이 초기 화 되 자마자 비교 방식 이 생 겼 다.
원소 자체 가 비교 성 을 갖 추 지 못 하거나 갖 추 는 비교 성 은 필요 한 것 이 아니다.이 럴 때 는 용기 자체 가 비교 성 을 갖 도록 해 야 한다.비교 기 를 정의 하고 비교 기 대상 을 매개 변수 로 TreeSet 집합 에 전달 하 는 구조 함수
두 가지 정렬 이 모두 존재 할 때 비교 기 를 위주 로 한다.
/*
:
,
*/
import java.util.*;
class TreeSetTest
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new StrLenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahahaha");
Iterator it = ts.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class StrLenComparator implements Comparator
{
public int compare(Object o1,Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
/*
if(s1.length()>s2.length())
return 1;
if(s1.length()==s2.length())
return 0;
*/
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num==0)
return s1.compareTo(s2);
return num;
}
}
범 형: JDK 1.5 이후 에 새로운 특성 이 나타 나 안전 문 제 를 해결 하 는 데 사용 되 는 유형 안전 체제 입 니 다.
장점: 1. 운영 시기 에 발생 한 문 제 를 ClassCastException 으로 옮 겨 컴 파일 시기 에 프로그래머 가 문 제 를 해결 하 는 데 편리 하고 운영 시기 에 문 제 를 감소 시 키 며 안전 합 니 다.
2. 강제 전환 의 번 거 로 움 을 피한다.
일반적인 형식: < > 를 통 해 조작 할 참조 데이터 형식 을 정의 합 니 다.
자바 가 제공 하 는 대상 을 사용 할 때 팬 형 은 언제 씁 니까?
보통 집합 프레임 워 크 에서 흔히 볼 수 있 습 니 다. < > 를 보면 범 형 을 정의 해 야 합 니 다. 사실은 < > 는 수신 유형 입 니 다.
집합 을 사용 할 때 집합 에 저장 할 데이터 형식 을 매개 변수 로 < > 에 전달 하면 됩 니 다.
class GenericDemo
{
public static void main(String[] args)
{
ArrayList a1 = new ArrayList();
a1.add("abc01");
a1.add("abc0991");
a1.add("abc014");
//a1.add(4);//a1.add(new Integer(4));
Iterator it = a1.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s+":"+s.length());
}
}
}
범 형 류 가 정의 하 는 범 형 은 전체 클래스 에서 유효 합 니 다.방법 에 쓰 이면그러면 범 형 류 의 대상 이 구체 적 으로 조작 해 야 할 유형 을 명 확 히 한 후에 모든 조작 유형 은 서로 다른 방법 으로 서로 다른 유형 을 조작 할 수 있 도록 고정 되 었 고 유형 이 확실 하지 않 으 면 범 형 을 방법 에 정의 할 수 있다.
특수 한 점: 정적 방법 은 클래스 에서 정의 하 는 범 형 에 접근 할 수 없습니다.정적 방법 으로 작 동 하 는 응용 데이터 형식 이 확실 하지 않 으 면 일반적인 방법 으로 정의 할 수 있 습 니 다.
메모: 일반적인 정 의 는 방법 에 있어 서 반환 값 형식의 앞 에 놓 고 수정자 의 뒤에 놓 아야 합 니 다.
?어댑터
범 형의 한정: [범 형의 고급 응용, 범 형의 복합 응용]
? extends E: E 타 입 이나 E 의 하위 타 입, 상한 선 을 받 을 수 있 습 니 다.?슈퍼 E: E 타 입 이나 E 의 부모 타 입, 하한 선 을 받 을 수 있 습 니 다.
Map 집합: 이 집합 은 키 값 이 맞 고 한 쌍 씩 안 으로 저장 되 며 키 의 유일 성 을 확보 해 야 합 니 다. 1. 첨가 put(K key,V value) putAll(Map extends K,? extends V> m)
2, 삭제 clear() remove(Object key)
3, 판단 containsValue(Object value) containsKey(Object key) isEmpty()
4, 획득 get(Object key) size() values()
entrySet() keySet()
Map |--Hashtable: 밑바닥 은 해시 표 데이터 구조 로 null 키 null 값 을 저장 할 수 없습니다. 이 집합 은 스 레 드 동기 화 이다.[JDK 1.0] 효율 이 낮 아 요.
|--HashMap: 밑바닥 은 해시 표 데이터 구조 로 null 키 와 null 값 을 사용 할 수 있 습 니 다. 이 집합 은 동기 화 되 지 않 는 다.[JDK 1.2] 효율 이 높 아 요.
|--TreeMap: 밑바닥 은 이 진 트 리 데이터 구조 로 라인 이 일치 하지 않 습 니 다.주다 맵 집합 중의 키 를 정렬 합 니 다.
Set 와 비슷 하 다. 사실 Set 밑바닥 은 Map 집합 을 사용 했다.
import java.util.*;
class MapDemo
{
public static void main(String[] args)
{
Map map = new HashMap();
// , ,
// , put 。
System.out.println("put:"+map.put("01","zhangsan1"));
System.out.println("put:"+map.put("01","wangwu"));
map.put("02","zhangsan2");
map.put("03","zhangsan3");
System.out.println("containsKey:"+map.containsKey("022"));
//System.out.println("remove:"+map.remove("02"));
System.out.println("get:"+map.get("023"));
map.put("04",null);
System.out.println("get:"+map.get("04"));
// get 。
// null 。
// map
Collection coll = map.values();
System.out.println(coll);
System.out.println(map);
}
}
map 집합 의 두 가지 추출 방식 1, Set: map 의 모든 키 를 set 집합 에 저장 합 니 다.set 가 교체 기 를 갖 추고 있 기 때문이다. 따라서 모든 키 를 교체 해서 꺼 내 고 get 방법 에 따라 모든 키 에 대응 하 는 값 을 얻 을 수 있 습 니 다.
맵 집합의 추출 원리: 맵 집합 을 set 집합 으로 바 꾸 고 교체 기 를 통 해 꺼낸다.
2. Set > entry Set: map 집합 에 있 는 맵 관 계 를 저장 합 니 다. set 집합 에서 이 관계 의 데이터 형식 은 맵. Entry 입 니 다.
연습: "sdfgzxcvasdfxcvdf" 이 문자열 의 알파벳 이 나타 나 는 횟수 를 가 져 옵 니 다. 결 과 를 인쇄 하 기 를 바 랍 니 다: a (1) c (2)...
구 조 를 통 해 모든 자모 가 대응 하 는 횟수 가 있다 는 것 을 알 수 있다. 이 는 자모 와 횟수 간 에 모두 매 핑 관계 가 있다 는 것 을 의미한다.
맵 집합 에 저 장 된 것 이 맵 관계 이기 때문에 맵 집합 을 선택 할 수 있 습 니 다.
맵 집합 은 언제 사용 합 니까?데이터 사이 에 맵 관계 가 존재 할 때 맵 집합 을 먼저 생각해 야 합 니 다.
사고: 1. 문자열 을 문자 배열 로 변환 합 니 다. 모든 알파벳 을 조작 해 야 하기 때 문 입 니 다.
2. 맵 집합 을 정의 합 니 다. 인쇄 결과 의 알파벳 은 순서 가 있 기 때문에 treemap 로 집합 합 니 다.
3. 문자 배열 옮 겨 다 니 기 모든 알파벳 을 키 로 map 집합 을 찾 습 니 다. null 로 돌아 가면 이 자모 와 1 을 map 집합 에 저장 합 니 다. 만약 되 돌아 오 는 것 이 null 이 아니라면, 이 알파벳 은 맵 집합 에 이미 존재 하고 이에 대응 하 는 것 을 설명 합 니 다. 그러면 이 횟수 를 가 져 와 서 자 증 한 다음 에 이 자모 와 자 증 된 횟수 를 저장 합 니 다. map 집합 에서 호출 원리 키 에 대응 하 는 값 을 덮어 씁 니 다.
4. map 집합 에 있 는 데 이 터 를 지정 한 문자열 형식 으로 되 돌려 줍 니 다.
import java.util.*;
class MapTest3
{
public static void main(String[] args)
{
String s = charCount("aakb+fc-dabcd1ke,fa");
System.out.println(s);
}
public static String charCount(String str)
{
char[] chs = str.toCharArray();
TreeMap tm = new TreeMap();
int count = 0;
for(int x=0; x='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
continue;
Integer value = tm.get(chs[x]);
if(value!=null)
count = value;
count++;
tm.put(chs[x],count);
count = 0;
/*
if(value==null)
{
tm.put(chs[x],1);
}
else
{
value = value + 1;
tm.put(chs[x],value);
}
*/
}
//System.out.println(tm);
StringBuilder sb = new StringBuilder();
Set> entrySet = tm.entrySet();
Iterator> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry me = it.next();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
}
집합 프레임 워 크 의 도구 클래스 Collections
대상 크기 를 비교 하거나 compare 또는 compare To
/*
Arrays:
asList: list
*/
import java.util.*;
class ArraysDemo
{
public static void main(String[] args)
{
//int[] arr = {2,4,5};
//System.out.println(Arrays.toString(arr));
String[] arr = {"abc","cc","kkkk"};
/*
: list ?
:
: , 。
。
contains
get
indexOf()
subList()
, UnsupportedOperationException
*/
List list = Arrays.asList(arr);
//sop("contains:"+list.contains("cc"));
//list.add("qq");//UnsupportedOperationException
//sop(list);
//int[] nums = {2,4,5};
Integer[] nums = {2,4,5};
Listli = Arrays.asList(nums);
/*
, ,
。 ,
。
*/
sop(li);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
Collection toArray
*/
import java.util.*;
class CollectionToArray
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("abc1");
al.add("abc2");
al.add("abc3");
/*
1、 ?
(1) size,
, size;
(2) size, ,
, 。
2、 ?
。 。
*/
String[] arr = al.toArray(new String[al.size()]);
sop(Arrays.toString(arr));
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
고급 for 순환
형식: for (데이터 형식 변수 이름: 옮 겨 다 니 는 집합 (Collection) 또는 배열) {
} 집합 을 옮 겨 다 니 면 집합 에 있 는 요소 만 가 져 올 수 있 지만 집합 을 조작 할 수 없습니다.
교체 기 는 옮 겨 다 니 는 것 외 에 remove 집합 에 있 는 요 소 를 사용 하 는 동작 도 할 수 있 습 니 다. ListIterator 를 사용 하면 옮 겨 다 니 는 과정 에서 집합 을 삭제 하고 검사 하 는 동작 도 할 수 있 습 니 다.
전통 for 와 고급 for 는 어떤 차이 가 있 습 니까?
고급 for 는 한계 가 있 습 니 다. 옮 겨 다 니 는 목표 가 있어 야 합 니 다.배열 을 옮 겨 다 닐 때 전통 for 를 사용 하 는 것 을 권장 합 니 다. 전통 for 는 각 표를 정의 할 수 있 기 때 문 입 니 다.
/*
JDK1.5
:
*/
class ParamMethodDemo
{
public static void main(String[] args)
{
/*
int[] arr = {3,4};
show(arr);
int[] arr1 = {2,3,4,5};
show(arr1);
*/
//
// , 。
show(2,4,5,6);
/*
,
*/
}
public static void show(int... arr)
{
System.out.println(arr.length);
}
}
/*
StaticImport
,
,
*/
import java.util.*;
import static java.util.Arrays.*;// Arrays
import static java.lang.System.*;// System
class StaticImport extends Object
{
public static void main(String[] args)
{
out.println("haha");
int[] arr = {3,1,5};
sort(arr);
int index = binarySearch(arr,1);
System.out.println(Arrays.toString(arr));
System.out.println("Index="+index);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.