Oh MyUtils

리스트 비교 - 두 목록 비교 & 차이점 찾기 온라인

두 목록을 비교하여 고유 항목, 중복, 교집합, 합집합을 찾아보세요. 집합 연산으로 처리 — 100% 클라이언트 사이드, 서버 전송 없음.

대소문자 구분
공백 제거
빈 줄 제거
정렬
리스트 A
리스트 B
A에만

항목 없음

자주 묻는 질문

리스트 비교기란 무엇이며 왜 필요한가요?

리스트 비교기는 두 목록의 항목을 가져와 집합 연산을 수행하여 차이점, 공통 요소 및 결합 결과를 찾는 도구입니다. 이메일 구독자 목록 비교, 데이터베이스 마이그레이션 검증, 서버 구성 감사, 스프레드시트 내보내기 간 누락 항목 찾기 등 데이터 조정 작업에 필수적입니다.

이 리스트 비교 도구는 어떻게 사용하나요?

리스트 A와 리스트 B 텍스트 영역에 항목을 한 줄에 하나씩 입력하세요. 도구가 실시간으로 자동 비교합니다. 결과는 탭으로 구성됩니다: A에만은 리스트 A에만 있는 항목, B에만은 리스트 B에만 있는 항목, 교집합은 두 리스트 모두에 있는 항목, 합집합은 모든 고유 항목, 대칭차는 한 리스트에만 있는 항목을 보여줍니다.

내 데이터는 안전한가요? 리스트가 서버에 업로드되나요?

데이터는 100% 안전하며 브라우저를 벗어나지 않습니다. 모든 리스트 비교 연산은 브라우저에서 직접 실행되는 JavaScript를 사용하여 클라이언트 측에서 수행됩니다. 서버로 데이터가 전송되지 않으며 저장되지도 않습니다. 이메일 주소, 사용자 ID 또는 독점 기록과 같은 민감한 데이터를 안전하게 비교할 수 있습니다.

차집합과 대칭차의 차이점은 무엇인가요?

차집합(A - B)은 리스트 A에는 있지만 리스트 B에는 없는 항목을 제공합니다. 방향성이 있어 A - B와 B - A의 결과가 다릅니다. 대칭차(A XOR B)는 두 리스트 중 하나에만 있는 모든 항목을 제공합니다 — (A - B)와 (B - A)의 결합입니다.

대소문자 구분은 비교에 어떤 영향을 미치나요?

대소문자 구분이 활성화되면(기본값) Apple과 apple은 다른 항목으로 처리됩니다. 비활성화하면 같은 항목으로 처리됩니다. 코드 식별자나 파일 경로를 비교하는 개발자 워크플로우에서는 대소문자 구분 모드가 적합하고, 이름이나 도시 같은 사람이 읽는 데이터에는 대소문자 무시 모드가 더 적합합니다.

통계에 표시되는 Jaccard 유사도 지수란 무엇인가요?

Jaccard 지수(Jaccard 유사 계수)는 두 집합이 얼마나 유사한지를 측정합니다. 교집합의 크기를 합집합의 크기로 나누어 계산합니다: J(A,B) = |A ∩ B| / |A ∪ B|. 0은 공통 항목이 없음을, 1(100%)은 리스트가 동일함을 의미합니다.

단일 리스트 내의 중복은 어떻게 처리되나요?

도구는 각 리스트 내의 중복을 감지하고 중복 A와 중복 B 탭에 발생 횟수와 함께 표시합니다. 집합 연산(차집합, 교집합, 합집합)에서는 각 고유 항목이 몇 번 나타나든 한 번만 계산됩니다.

매우 큰 리스트도 처리할 수 있나요?

네. 이 도구는 최신 브라우저에서 고도로 최적화된 JavaScript Set 연산을 사용합니다. 최대 100,000개 항목의 리스트를 500밀리초 이내에 비교할 수 있습니다. 300ms 디바운스를 사용하여 대용량 데이터셋을 붙여넣을 때도 결과가 부드럽게 업데이트됩니다.

코드 예제

// List comparison using JavaScript Set operations
function compareLists(listA, listB, options = {}) {
  const { caseSensitive = true, trimWhitespace = true } = options;

  const normalize = (item) => {
    let result = item;
    if (trimWhitespace) result = result.trim();
    if (!caseSensitive) result = result.toLowerCase();
    return result;
  };

  const itemsA = listA.map(normalize).filter(Boolean);
  const itemsB = listB.map(normalize).filter(Boolean);

  const setA = new Set(itemsA);
  const setB = new Set(itemsB);

  const onlyInA = [...setA].filter((item) => !setB.has(item));
  const onlyInB = [...setB].filter((item) => !setA.has(item));
  const intersection = [...setA].filter((item) => setB.has(item));
  const union = [...new Set([...setA, ...setB])];
  const symmetricDiff = [...onlyInA, ...onlyInB];

  const jaccardIndex = union.length > 0
    ? intersection.length / union.length : 0;

  return { onlyInA, onlyInB, intersection, union, symmetricDiff,
    stats: { jaccardIndex: Math.round(jaccardIndex * 1000) / 1000 } };
}

// Usage
const a = ['apple', 'banana', 'cherry', 'date'];
const b = ['banana', 'date', 'elderberry', 'fig'];
const result = compareLists(a, b);
console.log('Only in A:', result.onlyInA);
// ['apple', 'cherry']
console.log('Intersection:', result.intersection);
// ['banana', 'date']

관련 도구