IP주소 문자열을 가지는 목록 List<String> ipList 내부에 있는 IP주소를  정렬하는 방법

사용하는 클래스 java.util.Collections(class), java.util.Comparator(Interface)

정렬하는데 사용식 : 

Collections.sort(ipList, new IpListSortByIp());


IpListSortByIp.java

public class IpListSortByIp implements Comparator<String> {

        @Override
        public int compare(String o1, String o2) {
            try {
                if (InetAddress.getByName(o1).hashCode() > InetAddress.getByName(o2).hashCode()) {
                    return 1;
                } else if (InetAddress.getByName(o1).hashCode() < InetAddress.getByName(o2).hashCode()) {
                    return -1;
                }
            }
            catch (UnknownHostException e) {
                //Exception 처리
            }
            return 0;
        }
    }


간단히 정의를 한다면,

문자열 IP주소를 java.net.InetAddress 객체로 변형하여 그 객체가 가지고 있는 HashCode를 비교하여 정렬하는 방식이다. 

  인증되지 않은 애플리케이션을 실행해서 '안드로이드 마켓(최근 'play store'로 명칭 변경)'으로 이동하여 동일한 애플리케이션을 업데이트하려고 하면 위와 같은 팝업이 뜬다. 제거를 눌러서 폰에 설치되어 있는 애플리케이션을 제거하고, 설치하면 간단하게 처리가 된다.


위와 같은 상황이 뜬 것은, 안드로이드앱 업데이트 확인절차(안드로이드 마켓 말고 서비스를 제공하는 운영서버에 등록된 앱버전을 확인)를 걸쳐서 마켓으로 이동을 했을 때 나타나는 현상이다.

현재 구글마켓에서 등록된 앱버전을 확인할 수 있는 방법은 없어보인다.

JavaScript sort 참고 : http://www.w3schools.com/jsref/jsref_sort.asp
  
var testArray = [
    {"id" : 1, "total" : 3}, {"id" : 2, "total" : 20}, {"id" : 3, "total" : 12}, {"id" : 4, "total" : 9}, {"id" : 3, "total" : 24}
];
function custonSort(a, b) {
  if(a.total == b.total){ return 0} return  a.total > b.total ? 1 : -1;
}
testArray.sort(custonSort);
console.log(testArray);
<< 정렬 결과 >>
[
Object
  1. id1
  2. total3
  3. __proto__Object
,
Object
  1. id4
  2. total9
  3. __proto__Object
,
Object
  1. id3
  2. total12
  3. __proto__Object
,
Object
  1. id2
  2. total20
  3. __proto__Object
,
Object
  1. id3
  2. total24
  3. __proto__Object
]

간단하게 예제를 만들어봤다.


난 전혀 다른 곳을 파고 있었던 것이다. 



나는 웹 애플리케이션 개발자이기 때문에 운영체제를 몰라도 된다?


  모든 프로그램은 운영체제를 기반으로 하여 동작한다. 운영체제는 플랫폼이다. 최근에는 웹과
  운영체제에 대해서 이해를 함으로 인해서 프로그래밍을 할 때, 운영체제의 오류에 빠져드는 실수를 회피할 수 있는 가능성이 높아진다.


  자바는 운영체제에서 실행시킨 JVM(Java Virtual Machine)에 의해서 바이트 코드를 실행하기 때문에 운영체제의 영향을 받지 않는다고 알려져 있다(운영체제마다 약간의 차이는 있다는 생각이 들지만, 코딩하는 중에는 윈도우, 리눅스, 유닉스 에서 큰 영향은 없었다. 통합된 빌드과정과 웹서버에 코드를 배포하고 웹서버에서 구동시키는 형태였으니 그랬겠지만…).
 
  프로그래머가 직접 운영서버에다가 빌드를 하게 되는 경우가 얼마나 될까? 외부에서 접근이 가능한 서버라면 통합빌드 환경을 구축해두고서 원격배포를 할 수 있으니 크게 신경쓸 것이 그리 많지가 않다(SSH, FTP 접속, 웹서버의 설치 위치 확인, 스크립트 작성… 또 뭘 신경써야 하더라?).
  이전 프로젝트에서는 개발빌드환경을 신경쓸 필요가 없었다. 아키텍트가 개발에 필요한 웹서버 및 빌드환경을 구축해주고 알려줬기 때문에 이런 것들을 신경쓸 필요가 없었다. 로직과 기능을 개발하고 커밋하고 개발서버에서 빌드를 누르고 오류가 발생했는지 지켜보다가 정상빌드되며 개발서버에서 내가 구현한 기능이 정상동작하는지 확인하면 되었다.


  최근 공공기관에서 수주한 작은 SI프로젝트를 하면서 직접 리눅스LINUX(Redhat 6.0 Enterprise) 서버 콘솔Console로 접근해서 톰캣 서버(Tomcat 6.0)를 설치하고 jar파일을 복사하는 등의 일을 하면서 느끼는 거지만 프로그래머는 단순히 코딩만 하는 것이 아니라 운영체제를 충분히 알고 있어야 한다는 것이다. 어디가서 '리눅스 좀 씁니다, 요즘은 유닉스(맥북의 맥OS가 Unix 기반이니까)도 좀 씁니다.' 라고 이야기 했지만, 운영서버에 집접 배포본(.war)을 설치하고 구동시키는 것은 만만치가 않았다. 그나마 운영서버들이 모두 GUI를 제공했기 때문에 내가 운영체제를 쓰던 그대로 사용할 수가 있었다.


  리눅스 운영체제에서 애플리케이션이 설치되는 위치, 로그파일 생성 위치와 배포본의 압축해제 위치 등을 주의깊게 본 적이 없었는데, 이번 프로젝트를 하면서 깨달은 바가 좀 있다.
  물론 나 혼자였다면 훨씬 더 많은 시간을 들여야 했겠지만 곁에서 알려주시는 멘토가 있으셨기에 훨씬 수월하게 일을 처리할 수가 있었다. 우리 회사에서 진행하는 솔루션들도 이런 과정을 직접 프로그래머가 진행해야할 상황이 될 가능성이 높으니 이런 경험은 성장을 위한 좋은 밑거름이 되지 않을까?


  '프로그래머라면 자신이 사용하는 개발환경의 운영체제를 스스로 구축하고 사용하는 것을 피하지 않아야 한다.'고 생각한다. 꽤 많은 시간이 소요되는 작업이지만, JDK가 어떻게 설치되고 JDK_HOME의 위치가 어떻게 설치되는지, 경로를 설정할 때 ';'(윈도우)을 써야하는지 ':'(리눅스, 유닉스)을 써야하는지는 알아야 하지 않을까?

<openjpa-2.1.1-r422266:1148538 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Attempt to cast instance "...EntityItem@bbef5e8" to PersistenceCapable failed.  Ensure that it has been enhanced.

FailedObject: ...EntityItem@bbef5e8

at org.apache.openjpa.kernel.BrokerImpl.assertPersistenceCapable(BrokerImpl.java:4631)

at org.apache.openjpa.kernel.BrokerImpl.persistInternal(BrokerImpl.java:2610)

at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2555)

at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2538)

at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2442)

at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1077)

at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:715)

...

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)

at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)

at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)

at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)

at org.junit.runners.ParentRunner.run(ParentRunner.java:236)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)



[해결책]

persistence.xml 에 Item들을 추가하세요.

+ Recent posts